JavaScript从数组创建链表的代码生效原理?list变量更新逻辑解惑
搞懂链表函数中
list变量的更新逻辑 嘿,我来帮你拆解这个困惑的点!核心原因其实是JavaScript里对象的引用特性,咱们一步步来看:
先明确基础:JS的引用类型
ListNode是一个构造函数,它创建出来的是对象——在JavaScript里,对象属于「引用类型」:变量存储的不是对象本身,而是这个对象在内存中的引用地址。当你把一个对象变量赋值给另一个变量时,其实是把引用地址复制了一份,两个变量会指向内存里同一个对象。
逐行分析linkedList函数的执行过程
咱们拿你的输入数组l = [3, 1, 2, 3, 4, 5]来走一遍流程:
创建头节点:
let list = new ListNode(arr[0]);
这行代码在内存里创建了一个值为3的ListNode对象,list变量保存的是这个对象的引用地址(可以简单理解成list = 内存地址A)。复制引用:
let selectedNode = list;
这一步把list里的引用地址(内存地址A)复制给了selectedNode,所以现在list和selectedNode都指向同一个对象(内存地址A的那个节点)。循环构建链表:
- 第一次循环(i=1,值为1):
selectedNode.next = new ListNode(arr[i]);—— 这是在修改「内存地址A的节点」的next属性,给它添加了一个值为1的新节点。因为list也指向这个节点,所以list.next现在也指向这个新节点了!
然后selectedNode = selectedNode.next—— 这一步把selectedNode的引用换成了刚创建的新节点的地址(内存地址B),但list的引用还是停留在内存地址A(头节点),不会变。 - 后续循环以此类推:每次都是通过
selectedNode(当前节点的引用)给它添加next节点,然后把selectedNode移到下一个节点。而list始终牢牢指向最初的头节点,头节点的next链会不断延伸,最终形成完整的链表。
- 第一次循环(i=1,值为1):
用简单例子类比理解
如果还是有点懵,看这个普通对象的例子就懂了:
let obj1 = { name: 'Alice' }; let obj2 = obj1; // 复制引用,obj1和obj2指向同一个对象 obj2.age = 25; // 修改对象的属性 console.log(obj1); // 输出 { name: 'Alice', age: 25 }
你修改obj2的属性,obj1也会跟着变,因为它们指向同一个对象——链表的逻辑和这个完全一样!
最后,console.log(linkedList(l))输出的是头节点,但你可以通过它的next属性遍历整个链表,因为头节点的next已经被我们一步步构建好了。
内容的提问来源于stack exchange,提问作者Tyler L
相关产品推荐
相关产品推荐

