用Java一段时间后学Python,我的链表‘stutter’函数为何失效?
帮你排查链表stutter函数的问题
嘿,我看到你在练习链表的重复节点功能时遇到了麻烦,咱们来一步步找出问题所在,然后修正它~
首先,先分析你的原代码里的核心问题:
- 新节点被直接丢弃:在
for循环里,你创建了Node(current.data),但紧接着就把current.next重新赋值为原来的next,这导致刚创建的新节点根本没被加入到链表中,等于白创建了。 - 指针维护错误:你没有正确移动
current到新插入的节点,而是直接跳到原来的next,所以重复操作完全没生效,链表还是原来的样子。 - 隐藏的头节点问题:你的
LinkedList构造方法里,self.head是一个空的Node(没有数据),但你遍历的时候直接从self.head开始,这会导致空节点也被重复,这肯定不是你想要的。
接下来是修正后的代码,我会逐行解释逻辑:
class Node: def __init__(self, data=None): self.data = data self.next = None class LinkedList: def __init__(self): self.head = Node() # 空的头节点 def stutterNL(self, n): current = self.head.next # 跳过空的头节点,从第一个有数据的节点开始 while current is not None: original_next = current.next # 先保存当前节点原本的下一个节点,避免丢失后续链表 # 插入n-1个和当前节点数据相同的新节点 for _ in range(n - 1): new_node = Node(current.data) new_node.next = original_next # 新节点的next指向原本的下一个节点 current.next = new_node # 当前节点的next指向新节点,把新节点插入链表 current = new_node # 移动current到新节点,下一个新节点插在它后面 current = original_next # 处理完当前节点的重复,跳到原本的下一个节点继续 return self.head
测试一下效果
你可以用这段代码验证功能是否正常:
# 创建测试链表:1->2->3 ll = LinkedList() ll.head.next = Node(1) ll.head.next.next = Node(2) ll.head.next.next.next = Node(3) # 调用stutter函数,重复3次 ll.stutterNL(3) # 遍历输出结果 current = ll.head.next while current is not None: print(current.data, end="->") current = current.next # 输出应该是:1->1->1->2->2->2->3->3->3->
这样修改后,每个节点都会被正确重复指定的次数啦~学习链表的时候指针维护确实容易出错,多练几次就会越来越顺手的!
内容的提问来源于stack exchange,提问作者vp123
相关产品推荐
相关产品推荐

