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

关于LinkedList类__repr__方法nodes列表构建及调用机制的疑问

LinkedList类__repr__方法与节点更新逻辑解析

一、__repr__方法的调用时机

  • 直接在交互式Python环境中输入LinkedList实例并回车时,自动触发
  • 调用内置函数repr()传入LinkedList实例时,会执行该方法
  • 使用print()打印LinkedList实例时,若类未定义__str__方法,会自动调用__repr__(本次示例就属于这种情况)
  • 当LinkedList实例作为容器对象的元素被打印时,也会触发其__repr__

二、关于nodes列表的疑问

你看到的nodes = []是__repr__方法内部的局部变量,它只在每次调用__repr__时临时创建,用来收集当前链表所有节点的字符串表示,生成完返回结果后就会被销毁,和链表的实际数据存储没有任何关系。

链表的真实数据是通过Node对象之间的nextval引用链来维护的,整个链表的入口是LinkedList实例的self.head属性——它指向链表的第一个节点,后续节点通过每个节点的nextval依次相连,完全不需要依赖这个临时的nodes列表。

三、prepend和append方法的链表更新逻辑

prepend(头部插入)

每次调用prepend时:

  1. 创建一个新的Node对象,传入要添加的数据,并将新节点的nextval设置为当前链表的self.head(原链表的第一个节点)
  2. 将self.head重新赋值为这个新节点,新节点成为链表的新头部,原链表的所有节点挂在它后面

append(尾部插入)

每次调用append时:

  1. 如果链表是空的(self.head为None),直接把self.head设为新创建的Node对象
  2. 如果链表非空,从self.head开始遍历,找到最后一个节点(即nextval为None的节点)
  3. 把最后一个节点的nextval设置为新创建的Node对象,新节点被加到链表末尾

示例演示

# 创建链表实例
ll = LinkedList()
# 尾部添加元素1
ll.append(1)
# 头部添加元素0
ll.prepend(0)
# 打印链表,触发__repr__
print(ll)  # 输出:[0->1]

执行print(ll)时,__repr__从头节点(存储0的Node)开始遍历,依次把每个节点的字符串表示加入临时的nodes列表,最后拼接成格式化字符串返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:46:05