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

JavaScript链表指针操作疑问:为何headA/headB未随指针变更

JavaScript赋值机制与链表节点问题解析

一、基本类型与引用类型的赋值差异

基本类型(数字、字符串、布尔等)

赋值时直接复制值本身,两个变量各自持有独立的副本,修改其中一个不会影响另一个。比如你给出的示例:

var a = 10;
b = a ;
console.log(a,b); // 输出 10 10
// 如果后续修改 b = 20,a 还是 10,互不干扰

引用类型(对象、数组、链表节点等)

赋值时复制的是内存地址(引用),两个变量指向内存中同一个对象:

  • 如果修改的是对象的属性,会直接改动共享的那个对象,所以原变量也会看到变化,比如你的示例:
    var a = { "name" :"A" }
    b = a;
    b.name = "C";
    console.log(a,b); // 输出 {name: "C"} {name: "C"}
    
  • 但如果是直接给变量重新赋值(比如b = {name: "D"}),只是改变了变量b的引用指向,和原变量a的引用无关,a仍然指向原来的对象。

二、链表函数中headA/headB不变的原因

在getIntersectionNode函数里:

var getIntersectionNode = function(headA, headB) {
   let a = headA, b = headB;
    while (a !== b) {
        a = !a ? headB : a.next
        b = !b ? headA : b.next
    }
    return a    
};
  • 初始时a = headA、b = headB只是让a、b拿到了headA、headB的引用,但后续的a = a.next或a = headB是给变量a重新赋值,只是改变了a的引用指向,并没有修改headA本身的指向,也没有修改headA指向的节点的属性。
  • 简单说:headA是一个指向头节点的指针,a是另一个指针,一开始和headA指向同一个节点,但后来a转而去指其他节点,完全不会影响headA的指向,所以headA和headB自始至终都保持最初的状态。

内容的提问来源于stack exchange,提问作者amit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:15:26