旋转链表问题实现求助:基于双指针思路的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
相关产品推荐
相关产品推荐

