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
相关产品推荐
相关产品推荐

