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

用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:32