单链表push方法对Head节点的作用及Head变化疑问解析
关于单链表push方法中Head关联变化的疑问解答
核心结论
首先明确:Head确实只应该指向链表的第一个Node对象,你的理解完全正确。JSON输出里看起来Head关联了后续节点,并不是Head的指向发生了改变,而是因为链表节点是通过引用类型的next指针串联的,序列化时会递归展开整个引用链。
拆解push过程的对象引用逻辑
JavaScript里的对象是引用类型,变量存储的是对象在内存中的地址,而非对象本身。我们一步步拆解push的执行过程:
第一次push(1):
- 创建
newNode(val=1,next=null) - 因
this.head为空,this.head = newNode让Head指向val=1的节点;接着this.tail = this.head,Tail也指向同一个val=1的节点(和Head共享同一块内存地址)。 - 此时链表结构:
Head → [1, null] ← Tail
- 创建
第二次push(2):
- 创建
newNode(val=2,next=null) - 进入else分支:
this.tail.next = newNode—— 此时this.tail仍指向val=1的节点,这行代码实际是把val=1节点的next属性修改为指向val=2的节点。 - 随后
this.tail = newNode,Tail转而指向val=2的节点。 - 此时Head依然指向val=1的节点,但该节点的
next已链到val=2的节点,链表结构:Head → [1, → [2, null]],Tail指向[2, null]
- 创建
第三次push(3):
- 创建
newNode(val=3,next=null) this.tail.next = newNode—— 当前Tail指向val=2的节点,这行代码把val=2节点的next修改为指向val=3的节点。this.tail = newNode,Tail最终指向val=3的节点。- Head始终指向val=1的节点,而val=1的
next链着val=2,val=2的next链着val=3,形成完整的单向链表。
- 创建
为什么JSON输出里Head包含后续节点?
JSON.stringify会递归遍历对象的所有引用属性,把整个链表链展开成嵌套结构。但这只是序列化的表现形式,实际上Head变量本身从未改变指向——始终只指向第一个Node对象,变化的是第一个Node对象的next属性,以及Tail的指向。
你可以通过执行console.log(list.head === list.tail)验证:push(1)时结果为true,push(2)及之后结果为false,这直接证明后续push操作后,Head和Tail指向了不同的对象,Head的指向从未变动过。
内容的提问来源于stack exchange,提问作者Jim Chang
相关产品推荐
相关产品推荐

