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

旋转链表问题实现求助:基于双指针思路的Python代码调试

旋转链表问题排查与修正

问题分析

你的代码存在三个核心问题导致结果不符合预期:

  • 尾节点断开错误:你将previous = None,这只是把变量指向空,并没有修改链表中倒数第二个节点的next指针,原链表的尾部没有被正确断开,导致链表出现环。
  • 旋转次数硬编码:k=2写死在函数内,无法适配不同的旋转需求。
  • 未优化旋转次数:当k大于链表长度时,重复旋转整个链表是冗余操作,应该先计算链表长度,对k取模,减少循环次数。

修正后的代码

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def addlast(self, data):
        a = Node(data)
        if self.head is None:
             self.head = a
             self.tail = a
        else:
            self.tail.next = a
            self.tail = a

    def printlist(self):
        current = self.head
        while current is not None:
            print(current.data, "-->", end="")
            current = current.next
        print("NULL")

    def get_length(self):
        count = 0
        current = self.head
        while current:
            count +=1
            current = current.next
        return count

    def rotatelist(self, k):
        if self.head is None or self.head.next is None or k ==0:
            return
        length = self.get_length()
        k = k % length  # 处理k大于链表长度的情况
        while k >0:
            current = self.head.next    
            previous = self.head
            
            while current.next:
                current = current.next
                previous = previous.next

            # 正确修改指针:尾节点指向头,倒数第二个节点的next置空,更新头和尾
            current.next = self.head
            self.head = current
            previous.next = None
            self.tail = previous  # 更新tail指针,避免后续addlast出错
            k -=1

# 测试代码
obj = LinkedList()
obj.addlast(1)
obj.addlast(2)
obj.addlast(3)
obj.addlast(4)
obj.addlast(5)
obj.rotatelist(2)
obj.printlist()

关键修改说明

  • 修复尾节点断开逻辑:将previous = None改为previous.next = None,真正断开原链表的尾部,避免形成环。
  • 动态传入旋转次数:将rotatelist改为接收参数k,可以灵活指定旋转次数。
  • 优化旋转次数:新增get_length方法计算链表长度,对k取模,减少无效循环(比如k=7时,等价于k=2,只需旋转2次)。
  • 更新tail指针:每次旋转后将self.tail更新为previous,保证链表的tail指针始终指向正确的尾节点,避免后续操作出错。
  • 边界条件处理:在rotatelist开头判断空链表、单节点链表或k=0的情况,直接返回,无需处理。

运行修正后的代码,输入链表1→2→3→4→5,k=2时,输出为4 -->5 -->1 -->2 -->3 -->NULL,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:01:19