这是基本代码
function ListNode(x) {
this.value = x;
this.next = null;
}
function linkedList(arr){
let list = new ListNode(arr[0]);
let selectedNode = list;
for(let i = 1; i < arr.length; i++){
selectedNode.next = new ListNode(arr[i]);
selectedNode = selectedNode.next
}
return list
}
l = [3, 1, 2, 3, 4, 5];
console.log(linkedList(l));
出于某种原因,它只是起作用。我不知道“列表”变量如何在 linkedList(arr)函数中更改/更新。我看到selectedNode = list,但 list 永远不会改变。 list 使用构造函数new ListNode(arr [0])进行初始化,但在此之后,唯一正在更改的变量是 selectedNode 。 list.next 甚至没有代码可以更改为某些内容。
那么返回列表如何返回完整的链表?
答案 0 :(得分:4)
执行此操作let selectedNode = list;
时,两个变量指向内存中的相同值,在本例中为list
和selectedNode
。因此,修改链从列表开始,下游添加新的链接节点。
作者已将selectedNode
初始化为list
作为链接列表的起点(根节点)。
这个看起来像是let selectedNode = list;
+-----------------+------------------+
| list | selectedNode |
+-----------------+------------------+
| | | |
| {value: 3, | | |
| next: null } <---------+ |
| | |
+-----------------+------------------+
因此,每次迭代都会修改相同的list
对象,因为下一个节点与之前的节点绑定/链接:
selectedNode.next = new ListNode(arr[i]); i = 1
+-------------------+------------------+
| list | selectedNode |
+-------------------+------------------+
| | | |
| { | | |
| value: 3, | Points to | |
| next: { | next | |
| value: 1 <------------+ |
| next: null | |
| } | |
| } | |
| | |
+-------------------+------------------+
selectedNode.next = new ListNode(arr[i]); i = 2
+-----------------------+------------------+
| list | selectedNode |
+-----------------------+------------------+
| | | |
| { | | |
| value: 3, | | |
| next: { | | |
| value: 1 | Points to | |
| next: { | next | |
| value: 2, <------------+ |
| next: null | |
| } | |
| } | |
| } | |
| | |
+-----------------------+------------------+
等等。
答案 1 :(得分:1)
当您将对象类型分配给变量时,变量的值不是实际对象,而是对它的引用。因此,当您执行selectedNode = list
时,两个变量都引用相同的对象,并且对该对象的任何更改(使用对它的任何引用)都将在其任何引用中可见。
简而言之:list
变量不会发生变化,但它所引用的对象会发生变化。
答案 2 :(得分:1)
function linkedList(arr){
return arr.reduceRight((next, value) => ({value, next}), null);
}
l = [3, 1, 2, 3, 4, 5];
console.log(linkedList(l));
&#13;
对于这样一个简单的对象,你不需要课程ListNode
。