如何从Javascript中的数组制作链表

Tyl*_*r L 5 javascript

这是基本代码

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])初始化,但在那之后,唯一发生变化的变量是selectedNodelist.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对于这样一个简单的对象,您不需要该类。


Ele*_*Ele 5

执行此操作时,let selectedNode = list;两个变量指向内存中的相同值,在这种情况下,listselectedNode. 因此,修改链从列表和下游添加新的链接节点开始。

作者已将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)

等等。