Python链表尾插函数失效问题求助:为何一个有效一个返回空链表?
链表尾插方法失效原因分析
我是Python新手,正在学习数据结构与算法(DSA)。实现LinkedList的尾插方法insert_at_end时遇到问题:两个版本的函数,一个能正常插入节点并输出正确链表,另一个调用后始终显示空链表。以下是相关代码及测试结果,求分析失效原因。
工作的尾插函数代码
class Node: def __init__(self, data=None, next=None): self.data = data self.next = next class LinkedList: def __init__(self): self.head = None def insert_at_end(self,data): # 此函数正常工作 print('self.head: ', self.head) if self.head is None: self.head = Node(data, None) return itr = self.head while itr.next != None: itr = itr.next itr.next = Node(data, None)
失效的尾插函数代码
def insert_at_end(self,data): # 此函数无法正常工作 n = self.head node = Node(data, None) if n is None: n = node return while n.next != None: n = n.next n.next = node
测试代码
if __name__ == '__main__': ll = LinkedList() ll.insert_at_end(100) ll.insert_at_end(101) ll.print_ll()
打印链表函数代码
def print_ll(self): if self.head == None: print("Empty Linked List") return n = self.head strll = '' while n != None: strll += str(n.data) + '-->' print("linkedlist: ", strll) n = self.next # 此处存在错误,应为n = n.next
测试结果
- 工作的函数输出:
100-->101--> - 失效的函数输出:
Empty Linked List
失效原因分析
1. 尾插函数的核心问题
失效版本的insert_at_end函数中,当链表为空(self.head是None)时,代码执行了n = node的操作,但**n只是一个局部变量**——它只是self.head的临时引用。给n赋值新的Node对象,只会改变局部变量n的指向,并不会修改LinkedList实例的self.head属性。因此链表的头节点始终是None,打印时自然显示空链表。
而工作版本的函数在链表为空时,直接修改了self.head = Node(data, None),真正更新了链表的头节点,后续的遍历和插入操作才能正常进行。
2. 打印函数的额外错误
另外注意到打印函数print_ll中存在一个错误:n = self.next应该改为n = n.next。你提到工作的函数能输出正确结果,推测是粘贴代码时的笔误,实际运行的打印函数是正确的。如果保留这个错误,即使尾插函数正常,打印也会陷入死循环或报错。
内容的提问来源于stack exchange,提问作者papa_pig
相关产品推荐
相关产品推荐

