Javascript 未更新时,this.head如何直接更新?
我的LinkedList类有两个属性Javascript 未更新时,this.head如何直接更新?,javascript,data-structures,Javascript,Data Structures,我的LinkedList类有两个属性 这是我的头 这个尺寸 this.head用于包含对象列表。简单的逻辑是,如果我更新this.head,它的值应该被更新。但是,如果我将其值赋给其他变量,然后尝试更新该变量,则原始this.head不应更新 例如: 但这段代码与这种情况相矛盾。我不知道为什么this.head在没有直接引用的情况下在这里得到更新 insertAt(data, index){ if(index > 0 && index > this.size
this.head
用于包含对象列表。简单的逻辑是,如果我更新this.head
,它的值应该被更新。但是,如果我将其值赋给其他变量,然后尝试更新该变量,则原始this.head不应更新
例如:
但这段代码与这种情况相矛盾。我不知道为什么this.head
在没有直接引用的情况下在这里得到更新
insertAt(data, index){
if(index > 0 && index > this.size)
return
const node = new Node(data);
let current, previous;
current = this.head;
let count = 0;
while(count < index){
previous = current;
count++;
current = current.next;
}
node.next = current;
previous.next = node;
};
insertAt(数据、索引){
如果(索引>0&&index>此.size)
返回
const node=新节点(数据);
让现在,过去;
电流=这个头;
让计数=0;
while(计数<索引){
先前=当前;
计数++;
当前=当前。下一步;
}
node.next=当前;
previous.next=节点;
};
整段代码
class Node{
constructor(data, next = null){
this.data = data;
this.next = next;
}
}
class LinkedList{
constructor(){
this.head = null;
this.size = 0;
};
insert(data){
this.head = new Node(data, this.head);
this.size++;
};
insertAt(data, index){
if(index > 0 && index > this.size)
return
const node = new Node(data);
let current, previous;
current = this.head;
let count = 0;
while(count < index){
previous = current;
count++;
current = current.next;
}
node.next = current;
previous.next = node;
};
printElements(){
let current = this.head;
while(current){
console.log(current.data)
current = current.next;
}
};
}
类节点{
构造函数(数据,next=null){
这个数据=数据;
this.next=next;
}
}
类链接列表{
构造函数(){
this.head=null;
此值为0.size=0;
};
插入(数据){
this.head=新节点(数据,this.head);
这个.size++;
};
插入(数据、索引){
如果(索引>0&&index>此.size)
返回
const node=新节点(数据);
让现在,过去;
电流=这个头;
让计数=0;
while(计数<索引){
先前=当前;
计数++;
当前=当前。下一步;
}
node.next=当前;
previous.next=节点;
};
printElements(){
让电流=这个头;
while(当前){
console.log(当前的.data)
当前=当前。下一步;
}
};
}
让我们尝试一下显示您所询问的行为的最少示例,使其主要与语言无关,因为这不是特定于JS的
为什么这个片段不打印
20
?而是打印10
b = new Node(20);
a = new Node(10, b);
c = a;
c = c.next;
console.log(a.data);
b = new Node(10);
a = b;
a.data = 20;
console.log(b.data);
为什么此代码段不打印
10
?而是打印20
b = new Node(20);
a = new Node(10, b);
c = a;
c = c.next;
console.log(a.data);
b = new Node(10);
a = b;
a.data = 20;
console.log(b.data);
这两个问题都是由于变量和对象相互混淆而产生的。这两个概念相互关联,但又截然不同 当我们说像
b=newnode(20)代码>,我们正在声明一个变量b
,实例化一个对象节点(20)
,并引用变量中的对象b
保存对节点(20)
的引用。如果我们说b.data=30
,现在b
保存对节点(30)
的引用。这是与以前相同的节点,但其数据已更改。到目前为止,对象/变量的区别还没有显现出来
我们也可以说a=b代码>,如第二个示例所示。这意味着我们有两个变量都引用相同的节点(20)
对象。如果我们说a.data=30
,则变量a
的数据引用的对象被设置为30
。因此,由于只有一个节点对象,b.data
和a.data
都是30
当我们说像c=a;c=c.next
,由a
引用的节点仍然存在,仍然由a
引用a
像一个箭头,指向节点(10)
c
是另一个箭头,也指向节点(10)
<代码>c=c,下一步代码>对a
没有影响。它只是改变了c
所指的内容。请详细说明您认为问题所在。具体来说,哪些行、它们在做什么以及您认为它们应该做什么。在insertAt函数中,当我们更新节点.next
和previous.next
时,它直接影响this.head
,而不显式更新this.head
。当涉及printElements()函数时,这种行为是不一致的。您是否尝试过使用调试器单步检查代码以查看发生了什么?为什么您认为更新头部的next
指针是个问题?否则,您将如何在头之后立即插入节点?不,这正是通过更新下一个指针插入节点的方式。我对javascript如何更新属性感到困惑,因为当我们打印列表时,它不会在printElements中更新属性。我真的很难理解您提出的问题。你想知道当previous=head
我们说previous.next=node
时,head
是如何更新的吗?