返回
曾被反转链表支配的恐惧,一招化解
Android
2023-10-21 06:17:04
曾被反转链表支配的恐惧,一招化解!
反转链表是一个经典的编程面试题,也是一个非常有用的数据结构操作。它可以在许多场景中使用,比如字符串反转、栈的实现、队列的实现等。
反转链表有很多种方法,最常用的两种方法是迭代法和递归法。
迭代法
迭代法是比较简单的一种方法,它使用两个指针来遍历链表。第一个指针指向当前节点,第二个指针指向下一个节点。在每次迭代中,我们把当前节点的下一个指针指向第二个指针,然后把第二个指针指向当前节点。这样,我们就可以一步一步地反转链表。
def reverse_list_iterative(head):
prev = None
current = head
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev
递归法
递归法也是一种常用的方法,它使用一个函数来反转链表。这个函数接收一个节点作为参数,并返回反转后的链表。在函数中,我们首先检查节点是否为空。如果是,则返回空链表。否则,我们把节点的下一个指针指向函数的返回值,然后把节点的下一个指针指向空。这样,我们就递归地反转了链表。
def reverse_list_recursive(head):
if not head:
return None
new_head = reverse_list_recursive(head.next)
head.next.next = head
head.next = None
return new_head
技巧
在反转链表时,需要注意以下几点:
- 在迭代法中,我们不能直接把当前节点的下一个指针指向空,因为这会破坏链表的结构。
- 在递归法中,我们不能直接把节点的下一个指针指向空,因为这也会破坏链表的结构。
- 在反转链表后,我们需要把头节点的指针指向空,因为头节点的下一个节点已经不是原来的头节点了。
示例
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
reversed_head = reverse_list_iterative(head)
while reversed_head:
print(reversed_head.val)
reversed_head = reversed_head.next
输出:
5
4
3
2
1