关于JavaScript链表mergeTwoLists中temp赋值逻辑的困惑
链表变量赋值逻辑解惑
为什么temp = temp.next得到的是节点对象而非单个值?
ListNode是JS中的对象类型,这类变量存储的不是对象本身,而是指向内存中对象的引用地址。temp.next指向的是一个完整的ListNode实例(比如val为1、next指向val为2的节点),执行temp = temp.next时,只是把temp变量的引用地址改成了temp.next对应的节点地址,所以temp现在指向的是这个完整的节点对象。控制台显示的[1,2]是对链表节点的格式化展示——它会自动展开节点的next链,把后续关联的节点都列出来,但temp本身只指向val=1的那个节点。
链表变量和普通值类型变量的差异
- 像
var apple = 'apple'这类值类型(字符串、数字等原始类型),变量直接存储具体的值,赋值时是值的拷贝。 - 链表节点属于引用类型,变量存的是对象的内存地址。
temp = temp.next只是改变了temp变量的指向,并没有修改任何节点的内容——就像你手里的指针从指向A盒子改成指向B盒子,A和B盒子本身都没被改动。
结合你的代码逻辑拆解
你初始化时temp和head都指向同一个val=0的头节点:
- 当执行
temp.next = list1时,是把val=0节点的next属性,指向了list1的第一个节点(比如val=1的节点)。 - 执行
temp = temp.next后,temp的指向从val=0的节点切换到了val=1的节点。控制台打印这个节点时,会顺着它的next属性展开后续节点,所以显示成[1,2],但temp本身只是指向val=1的那个节点。
内容的提问来源于stack exchange,提问作者Yeo Bryan
相关产品推荐
相关产品推荐

