javascript 链表实现中的功能/变量范围

Functional/ Variable scope in a javascript linked list implementaion

参考leetcode的javascript解法-两个数相加https://leetcode.com/problems/add-two-numbers/

为什么当 head 作用域改变时列表作用域没有改变,即当 head.next 被分配给新的节点引用并且 head 被分配回 head.next,那么为什么 List.next 没有' t变化,与整个链表保持一致

请参考以下解决方案-

Definition for singly-linked list.
function ListNode(val) {
    this.val = val;
    this.next = null;
}
@param {ListNode} l1
@param {ListNode} l2
@return {ListNode}

var addTwoNumbers = function(l1, l2) {
    var List = new ListNode(0);
    var head = List;
    var sum = 0;
    var carry = 0;

    while(l1!==null||l2!==null||sum>0){

        if(l1!==null){
            sum = sum + l1.val;
            l1 = l1.next;
        }
        if(l2!==null){
            sum = sum + l2.val;
            l2 = l2.next;
        }
        if(sum>=10){
            carry = 1;
            sum = sum - 10;
        }

        head.next = new ListNode(sum);
        head = head.next;

        sum = carry;
        carry = 0;

    }

    return List.next;
};

我尝试了下面的操作,但它在下面给出了一些不同的输出,b.next 在 a.next 更改时更改,为什么这样?

function value (val){ this.x = val;this.next = null;}
let a = new value(1);
console.log(a.x);
console.log(a.next, "a next");
let b = a;
console.log(b.x);
console.log(b.next,"b next")
a.next = 23;
console.log(a.next, "a next");
console.log(b.next,"b next")

VM1592:3 1
VM1592:4 null 'a next'
VM1592:6 1
VM1592:7 null 'b next'
VM1592:9 23 'a next'
VM1592:10 23 'b next'

在上面的例子中列表没有改变但是头部改变了?为什么 b 随 a 改变而改变?为什么

headList 是保存对相同 ListNode 的引用的变量。 ListNode 是一个可变对象。因此,当您更改 head 的属性时,比如更改其 next 属性, this is reflected also in List`,因为它们都指向同一个对象。

现在,当您更改 head 的值时,说 head = head.nextList 仍然指的是初始 ListNodeheadList 不是彼此的引用。改变一个本身并不会改变另一个。它们只是指向对象的指针。只有改变对象本身的属性才会反映到另一个,只要两者都指向同一个对象(开头就是)。