You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript从数组创建链表的代码生效原理?list变量更新逻辑解惑

搞懂链表函数中list变量的更新逻辑

嘿,我来帮你拆解这个困惑的点!核心原因其实是JavaScript里对象的引用特性,咱们一步步来看:

先明确基础:JS的引用类型

ListNode是一个构造函数,它创建出来的是对象——在JavaScript里,对象属于「引用类型」:变量存储的不是对象本身,而是这个对象在内存中的引用地址。当你把一个对象变量赋值给另一个变量时,其实是把引用地址复制了一份,两个变量会指向内存里同一个对象。

逐行分析linkedList函数的执行过程

咱们拿你的输入数组l = [3, 1, 2, 3, 4, 5]来走一遍流程:

  1. 创建头节点:let list = new ListNode(arr[0]);
    这行代码在内存里创建了一个值为3的ListNode对象,list变量保存的是这个对象的引用地址(可以简单理解成list = 内存地址A)。

  2. 复制引用:let selectedNode = list;
    这一步把list里的引用地址(内存地址A)复制给了selectedNode,所以现在list和selectedNode都指向同一个对象(内存地址A的那个节点)。

  3. 循环构建链表:

    • 第一次循环(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链会不断延伸,最终形成完整的链表。

用简单例子类比理解

如果还是有点懵,看这个普通对象的例子就懂了:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:02:08