单链表head与指针疑问:反转后head为何仅含最后一个元素?
单链表反转后原head变化的原因解析
核心本质:对象引用与可变对象的特性
这不是LeetCode的特殊实现,而是Python(以及大多数面向对象语言)中对象引用和可变对象的固有特性:
- 单链表的每个节点是一个可变对象(比如包含
val和next属性的实例) head、curr这类变量存储的是指向节点对象的引用,而非对象本身- 当你通过引用修改对象的内部属性(比如
curr.next = prev)时,修改的是对象本身,所有指向该对象的引用(包括原head)都会看到这个变化
结合代码的分步拆解
假设原链表是 1 -> 2 -> 3 -> None,head 指向节点1。
执行反转函数时:
- 初始状态:
prev = None,curr = head(指向节点1) - 第一次循环:
nxt = curr.next→ 指向节点2curr.next = prev→ 节点1的next被修改为None(这一步直接改变了原head指向的节点的属性)prev = curr→ prev指向节点1curr = nxt→ curr指向节点2
- 后续循环会依次修改节点2、3的
next属性,最终让整个链表反转 - 循环结束后,
prev指向节点3(反转后的新头),而原head依然指向节点1,但节点1的next已经是None——所以原head看起来就像“仅包含最后一个元素”
关于“head自动更新”的误解
原head并没有被“自动更新”:
head变量本身的指向从未改变,它始终指向最初的节点1- 变化的是节点1的内部属性(
next),导致从head出发只能遍历到它自己,因为它的next已经是None了
内容的提问来源于stack exchange,提问作者Robben_10
相关产品推荐
相关产品推荐

