在 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 等属性,才能真正切断或重连链表。
以下代码清晰展示了差异:
⚠️ 注意事项:
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
Python 中没有“指针算术”,也没有隐式结构更新;所有结构变更必须通过属性赋值(node.next = ...)显式完成;
若需删除尾节点,必须持有其前驱节点(如 b)并修改其 .next;
使用 id() 可验证:id(c) 在 c = c.next 前后会变化,而 id(b.next) 始终不变(除非你主动改它)。
总结:链表的“形状”由节点间 .next 属性的值共同定义,而非由临时变量的指向决定。编写链表操作时,始终问自己:“我是在修改哪个节点的 .next?”——答案决定了逻辑是否正确。
立即学习
“
Python免费学习笔记(深入)
”;
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