
在 python 中,对 listnode 类型变量重新赋值(如 c = c.next)仅改变该变量的引用指向,不会影响原链表中节点间的连接关系;真正修改链表结构需显式操作节点的 next 属性。
在 python 中,对 listnode 类型变量重新赋值(如 c = c.next)仅改变该变量的引用指向,不会影响原链表中节点间的连接关系;真正修改链表结构需显式操作节点的 next 属性。
理解这一现象的关键在于区分 变量名(name) 与 对象属性(attribute) 的本质差异。
Python 中的变量本质上是“标签”或“引用”,它们并不等同于内存中的对象本身。当你执行:
c = c.next
你只是将变量 c 这个标签从原先指向 ListNode(3) 对象,改为指向 None(因为 c.next 是 None)。而链表的物理结构——即 b.next 所存储的地址——完全未被触动。b.next 依然牢牢指向 ListNode(3),因此从 a 出发遍历链表时,仍能看到完整的 1 → 2 → 3 → None。
下面通过内存图示和代码验证进一步说明:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
初始状态:
a = ListNode(1) b = ListNode(2) c = ListNode(3) a.next = b b.next = c # 此时:a.next is b, b.next is c, c.next is None
执行 c = c.next 后:
c = c.next # c 现在是 None,但 b.next 仍是 c(即原 ListNode(3) 对象) print(b.next.val) # ✅ 输出 3 —— 链表结构未变 print(a.next.next.next) # ✅ 输出 ListNode(3),非 None
✅ 正确删除末尾节点的方式应为:
b.next = None # 直接修改前驱节点的 next 属性 # 此时从 a 遍历:1 → 2 → None
⚠️ 注意事项:
- c = c.next 改变的是局部变量 c 的绑定,属于重绑定(rebinding),不触发任何对象修改;
- b.next = None 是属性赋值(attribute assignment),直接更新了 ListNode(2) 对象内部的 next 字段;
- 若需通用地删除某节点,必须持有其前驱节点(或使用哨兵节点技巧),因为单向链表无法反向访问父节点。
? 总结:
Python 的赋值操作永远作用于“名称”,而非“路径”。要修改链表拓扑,必须精准定位并更新相应节点的 next(或 val)属性,而非仅移动游标变量。这是理解链表、树等引用结构操作的基础前提。

















