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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:23:16