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

Python链表打印输出内存地址需双重调用val属性问题求解

问题根因

你的链表出现双层val调用的核心原因是节点被重复封装了:
LinkedList类的append方法设计逻辑是接收原始存储值,内部自动创建LinkedNode节点完成挂载。但你在外部调用append时,没有传入2、3、4这类原始值,而是手动提前创建了LinkedNode对象传入,最终导致节点嵌套:

  1. 第一层是append方法内部新建的LinkedNode实例,它的val属性存的是你传入的手动创建的LinkedNode对象
  2. 第二层是你手动创建的LinkedNode实例,它的val属性才是真正要存储的数值

直接打印curr.val拿到的是第一层节点里存的内层节点对象,默认输出就是对象内存地址,必须再取一层.val才能拿到真实数据。

解决方案

两种方案二选一即可,不要混合使用:

  • 方案1(推荐,符合链表常规封装设计):保留append现有逻辑,修改外部调用方式,直接传入原始存储值,不需要手动创建节点
    把测试部分的代码修改为:
    l1 = LinkedList()
    l1.append(2)
    l1.append(3)
    l1.append(4)
    l1.print()
    
    改完后print方法里的print(curr.val)就可以直接输出正确数值,调用方不需要关心内部节点的实现细节,封装性更好。
  • 方案2(适合需要自定义节点特殊属性的场景):保留外部传LinkedNode的调用方式,修改append内部逻辑,去掉重复的节点创建步骤
    把append方法改写为:
    def append(self, new_node):
        if self.head:
            curr = self.head
            while curr.nxt:
                curr = curr.nxt
            curr.nxt = new_node
        else:
            self.head = new_node
    
    这种写法下append直接接收已经创建好的节点挂载,不会产生嵌套,print(curr.val)也能正常拿到数值,但每次追加元素都需要手动构造LinkedNode对象,使用成本更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:42:31