206. 反转链表 - 力扣(LeetCode)
·
题目:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:

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

输入: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。
逻辑梳理:
-
基本情况:
-
如果链表为空(
head为None)或者只有一个节点(head.next为None),则直接返回head。因为这种情况下,反转后的链表就是它本身。
-
-
递归调用:
-
对链表的子部分(从
head.next开始)进行递归调用,得到反转后的子链表的头节点,存储在变量list中。
-
-
反转当前节点:
-
将当前节点的下一个节点的
next指针指向当前节点,实现当前节点与其下一个节点之间的反转。 -
然后将当前节点的
next指针置为None,以避免形成循环链表。
-
-
返回结果:
-
最终返回反转后的链表头节点
list。
-
更多推荐
所有评论(0)