You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 61. Rotate List:关于tail.next=None及代码的疑问

LeetCode 61题:旋转链表 疑问解答

问题背景

给定链表的head,将链表向右旋转k个位置。参考题解代码后,已理解构建循环链表的操作,但有两个疑问:

  1. 为何最后必须执行tail.next = None?
  2. 代码中执行tail = head,为何不是将原head的最后一个节点设为None?

题解代码如下:

class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head:
            return head
        
        # 计算链表长度并构建循环链表
        tail = head
        size = 1
        while tail.next:
            tail = tail.next
            size += 1
        tail.next = head
        
        # 计算需要移动的步数,调整头尾指针后打破循环
        for i in range(size - k % size):
            tail = head
            head = head.next
        tail.next = None
        
        return head

1. 为什么最后必须执行tail.next = None?

之前我们把原链表的尾节点指向了头节点,构建出了循环链表。如果不执行tail.next = None,这个链表会一直循环下去,没有终止节点——后续遍历的时候会陷入无限循环,而且题目要求返回的是标准的单链表(尾节点的next必须指向None)。所以这一步是必须的,用来打破循环,让链表恢复成正常的单链表结构。

2. 代码中执行tail = head,为何不是将原head的最后一个节点设为None?

你需要搞清楚循环调整后tail的实际指向:

  • 初始的tail确实是原链表的最后一个节点,但构建循环链表后,我们进入了指针移动的循环:每次先把tail指向当前的head,再把head往后移一位。这个过程的目的是找到旋转后的新尾节点和新头节点。
  • 比如链表长度为size,旋转k个位置等价于向右移动k%size步,新头节点是原链表中第size - k%size个节点,而新尾节点就是它的前一个节点。循环结束后,head指向新头节点,tail指向的就是这个新尾节点——我们需要把这个新尾节点的next设为None,而不是原链表的尾节点。

举个具体例子:原链表是1->2->3->4->5,k=2:

  1. 构建循环链表后,5->1,形成1->2->3->4->5->1...的循环结构。
  2. 计算需要移动的步数:size - k%size =5-2=3,循环3次:
    • 第1次:tail=1,head=2
    • 第2次:tail=2,head=3
    • 第3次:tail=3,head=4
  3. 此时head是旋转后的新头节点4,tail是新尾节点3。执行tail.next=None后,链表变成4->5->1->2->3->None,这正是旋转2次后的正确结果。如果我们去修改原尾节点5的next,结果就完全错误了。

内容的提问来源于stack exchange,提问作者Alucaard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:30:54