📜  反转链接列表 (1)

📅  最后修改于: 2023-12-03 15:37:07.715000             🧑  作者: Mango

反转链接列表介绍

在编程中,链接列表是一种重要的数据结构,我们经常需要把它反转。反转链接列表可以使得其前后的顺序完全相反,这在某些问题中是十分有用的。

如何实现

要实现反转链接列表,可以采用迭代或者递归的方式。下面分别阐述:

  1. 迭代法:通过定义两个指针,分别指向当前节点和前面已经反转的节点,然后不断地将当前节点插入到前面已经反转的节点之前。具体实现方法如下:
def reverseLinkedList(head: ListNode) -> ListNode:
    prev = None
    curr = head
    while curr is not None:
        next_node = curr.next
        curr.next = prev
        prev = curr
        curr = next_node
    return prev
  1. 递归法:递归的思想是先反转后面的链表,然后再将当前节点插入到后面链表的末尾。具体实现如下:
def reverseLinkedList(head: ListNode) -> ListNode:
    if head is None or head.next is None:
        return head
    p = reverseLinkedList(head.next)
    head.next.next = head
    head.next = None
    return p
时间和空间复杂度

迭代法和递归法的时间和空间复杂度都是O(n),其中n是链表的长度。迭代法和递归法都会遍历整个链表,因此时间复杂度为O(n)。空间复杂度主要取决于递归的深度,因为递归法需要调用系统栈,因此空间复杂度最坏情况下为O(n),其中n是链表的长度。

总结

反转链接列表是一种非常常见的操作,可以通过迭代法和递归法实现。其中迭代法的实现比较简单,而递归法需要注意递归的深度问题。在实际编程中,应该根据具体问题选择不同的实现方式。