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 改变而改变?为什么
head
和 List
是保存对相同 ListNode
的引用的变量。 ListNode
是一个可变对象。因此,当您更改 head
的属性时,比如更改其 next
属性, this is reflected also in
List`,因为它们都指向同一个对象。
现在,当您更改 head
的值时,说 head = head.next
,List
仍然指的是初始 ListNode
。 head
和 List
不是彼此的引用。改变一个本身并不会改变另一个。它们只是指向对象的指针。只有改变对象本身的属性才会反映到另一个,只要两者都指向同一个对象(开头就是)。
参考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 改变而改变?为什么
head
和 List
是保存对相同 ListNode
的引用的变量。 ListNode
是一个可变对象。因此,当您更改 head
的属性时,比如更改其 next
属性, this is reflected also in
List`,因为它们都指向同一个对象。
现在,当您更改 head
的值时,说 head = head.next
,List
仍然指的是初始 ListNode
。 head
和 List
不是彼此的引用。改变一个本身并不会改变另一个。它们只是指向对象的指针。只有改变对象本身的属性才会反映到另一个,只要两者都指向同一个对象(开头就是)。