这是基本代码
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));Run Code Online (Sandbox Code Playgroud)
出于某种原因,它只是有效。我不明白 ' list ' 变量如何在linksList(arr)函数中更改/更新。我看到 selectedNode = list,但列表永远不会改变。list使用构造函数 new ListNode(arr[0])初始化,但在那之后,唯一发生变化的变量是selectedNode。list.next甚至没有代码可以更改为某些内容。
那么返回列表是如何返回完整链表的呢?
Tho*_*mas 12
function linkedList(arr){
return arr.reduceRight((next, value) => ({value, next}), null);
}
l = [3, 1, 2, 3, 4, 5];
console.log(linkedList(l));Run Code Online (Sandbox Code Playgroud)
ListNode对于这样一个简单的对象,您不需要该类。
执行此操作时,let selectedNode = list;两个变量指向内存中的相同值,在这种情况下,list和selectedNode. 因此,修改链从列表和下游添加新的链接节点开始。
作者已将selectedNodewith初始化list为链表的起点(根节点)。
这看起来像这样的记忆 let selectedNode = list;
+-----------------+------------------+
| list | selectedNode |
+-----------------+------------------+
| | | |
| {value: 3, | | |
| next: null } <---------+ |
| | |
+-----------------+------------------+
Run Code Online (Sandbox Code Playgroud)
因此,每次迭代都会修改同一个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 | |
| } | |
| } | |
| } | |
| | |
+-----------------------+------------------+
Run Code Online (Sandbox Code Playgroud)
等等。
| 归档时间: |
|
| 查看次数: |
4364 次 |
| 最近记录: |