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

Python链表add方法实现异常,调用结果不符预期求助

链表add方法错误分析与修正

你的add方法逻辑存在根本性错误,每次调用时都会覆盖当前节点的item值,并且错误地将next指向自身,导致链表无法正确存储多个元素:

  • 第一次调用add(1):self.item被设为1,self.next指向当前对象(自引用);
  • 第二次调用add(2):self.next再次被设为自身(无意义操作),self.item被覆盖为2;
  • 最终myobj的item是2,next指向自己,所以print(myobj.next.item)输出2。

正确实现方式

链表的正确实现需要区分链表容器和节点,通常会单独定义Node类存储元素和指针,链表类维护头节点。以下提供两种常见实现:

1. 头插法(新元素添加到链表头部)

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

class LinkedList:
    def __init__(self):
        self.head = None  # 链表的头节点初始为空
    
    def add(self, val):
        # 创建新节点
        new_node = Node(val)
        # 新节点的next指向原头节点
        new_node.next = self.head
        # 更新链表头为新节点
        self.head = new_node

测试代码:

myobj = LinkedList()
myobj.add(1)
myobj.add(2)
# 此时head是存储2的节点,它的next是存储1的节点
print(myobj.head.next.item)  # 输出1,符合预期

2. 尾插法(新元素添加到链表尾部)

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

class LinkedList:
    def __init__(self):
        self.head = None  # 链表的头节点初始为空
    
    def add(self, val):
        new_node = Node(val)
        if not self.head:
            # 链表为空时,新节点直接作为头
            self.head = new_node
            return
        # 遍历到链表尾部
        current = self.head
        while current.next:
            current = current.next
        # 将尾部节点的next指向新节点
        current.next = new_node

测试代码:

myobj = LinkedList()
myobj.add(1)
myobj.add(2)
print(myobj.head.item)  # 输出1
print(myobj.head.next.item)  # 输出2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:46:08