📜  递归地反向链接列表(一个简单的实现)(1)

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

递归地反向链接列表

在编写程序的过程中,经常需要操作链表数据结构,其中有时需要将链表反转。本文将介绍一种递归地反向链接列表的简单实现。

代码实现
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseList(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head
    p = reverseList(head.next)
    head.next.next = head
    head.next = None
    return p
代码解释

这段代码使用 ListNode 类表示链表节点,并定义 reverseList 函数来实现递归地反向链接列表。

函数 reverseList 接收一个指向链表头节点的指针 head,并返回反转后的新链表的头节点指针。

递归终止条件是链表为空或者链表只有一个节点,则直接返回该节点。

当链表有多个节点时,递归调用反转剩余部分的链表,并记录返回值为 p

将当前节点的 next 指针指向前驱节点,即 head.next.next = head

最后将当前节点的 next 指针指向空节点,即 head.next = None

返回 p,即反转后的新链表的头节点指针。

代码执行示例

下面是一个简单的示例,说明函数 reverseList 的递归过程。

原链表:1 -> 2 -> 3 -> 4 -> 5 -> None

  1. 递归调用 reverseList(2),返回 p 为 5 -> 4 -> 3 -> 2 -> None;
  2. 让当前节点 2 的 next 指向前驱节点 1,即 2 -> 1 -> None;
  3. 令当前节点 1 的 next 指向空,即 1 -> None;
  4. 返回 p,即反转后的新链表的头节点指针 5 -> 4 -> 3 -> 2 -> 1 -> None。

反转后的新链表:5 -> 4 -> 3 -> 2 -> 1 -> None

结论

本文介绍了一种递归地反向链接列表的简单实现。该方法的时间复杂度为 O(n),空间复杂度为 O(n)。使用该方法可以在不使用额外空间的情况下实现链表的反转。