返回

曾被反转链表支配的恐惧,一招化解

Android

曾被反转链表支配的恐惧,一招化解!

反转链表是一个经典的编程面试题,也是一个非常有用的数据结构操作。它可以在许多场景中使用,比如字符串反转、栈的实现、队列的实现等。

反转链表有很多种方法,最常用的两种方法是迭代法和递归法。

迭代法

迭代法是比较简单的一种方法,它使用两个指针来遍历链表。第一个指针指向当前节点,第二个指针指向下一个节点。在每次迭代中,我们把当前节点的下一个指针指向第二个指针,然后把第二个指针指向当前节点。这样,我们就可以一步一步地反转链表。

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