在 Python 中,对链表节点变量(如 c = c.next)的重新赋值仅改变该变量指向,不会修改原链表结构;真正影响链表形态的是对节点属性(如 b.next = None)的显式修改。
在 python 中,对链表节点变量(如 `c = c.next`)的重新赋值仅改变该变量指向,不会修改原链表结构;真正影响链表形态的是对节点属性(如 `b.next = none`)的显式修改。
理解这一行为的关键在于区分 变量名(name) 和 对象属性(attribute):
- 变量(如 c)只是一个指向 ListNode 对象的引用标签,赋值操作(c = c.next)只是让这个标签指向新对象(此处为 None),不会触碰原对象的任何字段;
- 而链表的连接关系由节点的 .next 属性维持——只有修改 b.next、a.next 等属性,才能真正切断或重连链表。
以下代码清晰展示了差异:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
# 构建 1 -> 2 -> 3 -> None
a = ListNode(1)
b = ListNode(2)
c = ListNode(3)
a.next = b
b.next = c
# ❌ 错误理解:以为 c = c.next 会“删除”节点 c
c = c.next # 此时 c 变为 None,但 b.next 仍是 c(即原节点3)!
print(a.next.next.val) # 输出 3 —— 链表仍是 1->2->3->None
# ✅ 正确做法:修改前驱节点的 next 属性
b.next = None # 显式断开 b 与 c 的连接
print(a.next.next) # 输出 None —— 链表变为 1->2->None⚠️ 注意事项:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- Python 中没有“指针算术”,也没有隐式结构更新;所有结构变更必须通过属性赋值(node.next = ...)显式完成;
- 若需删除尾节点,必须持有其前驱节点(如 b)并修改其 .next;
- 使用 id() 可验证:id(c) 在 c = c.next 前后会变化,而 id(b.next) 始终不变(除非你主动改它)。
总结:链表的“形状”由节点间 .next 属性的值共同定义,而非由临时变量的指向决定。编写链表操作时,始终问自己:“我是在修改哪个节点的 .next?”——答案决定了逻辑是否正确。
立即学习“Python免费学习笔记(深入)”;

















