题目:

        给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

img

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

img

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]

  • -5000 <= Node.val <= 5000


思路如下:

        这是一道基础的链表反转题,采用的解题思想为递归。思路为以头节点 head 作为起点,反转剩余的链表,直至最后一个节点,最后再将 head 接到这个反转链表尾部即可。


题解如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        # 如果链表为空或者只有一个节点,直接返回头节点
        if not head or not head.next:
            return head 
        
        # 递归调用reverseList函数,反转链表的子部分(从head.next开始)
        list = self.reverseList(head.next)    
        # 将当前节点的下一个节点的next指针指向当前节点,实现反转
        head.next.next = head
        head.next = None
        
        return list
        

题解示例:

​
假设链表为 1 -> 2 -> 3 -> 4 -> 5:
​
初始调用:
head 指向节点 1,head.next 不为空,进入递归。
​
递归调用:
调用 reverseList(head.next),即对节点 2 -> 3 -> 4 -> 5 进行反转。
递归一直进行到 head 指向节点 5 时,head.next 为空,返回 head(节点 5)。
得到:5 <- 4 <- 3 <- 2
下面进行递归回溯,将箭头方向反转。
​
回溯过程:
当递归返回到节点 4 时,head 指向节点 4,head.next 指向节点 5。
执行 head.next.next = head,即节点 5 的 next 指向节点 4。
执行 head.next = None,即节点 4 的 next 置为 None。
返回节点 5 作为反转后的头节点。
​
继续回溯:
同样的操作依次在节点 3、2、1 上进行,最终整个链表反转为 5 -> 4 -> 3 -> 2 -> 1。
​
最终结果:
返回反转后的链表头节点 5。
​

逻辑梳理:

  1. 基本情况:

    • 如果链表为空(head 为 None)或者只有一个节点(head.next 为 None),则直接返回 head。因为这种情况下,反转后的链表就是它本身。

  2. 递归调用:

    • 对链表的子部分(从 head.next 开始)进行递归调用,得到反转后的子链表的头节点,存储在变量 list 中。

  3. 反转当前节点:

    • 将当前节点的下一个节点的 next 指针指向当前节点,实现当前节点与其下一个节点之间的反转。

    • 然后将当前节点的 next 指针置为 None,以避免形成循环链表。

  4. 返回结果:

    • 最终返回反转后的链表头节点 list。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐