如何在Javascript中从数组中创建链接列表

时间:2018-03-25 01:52:49

标签: 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));

出于某种原因,它只是起作用。我不知道“列表”变量如何在 linkedList(arr)函数中更改/更新。我看到selectedNode = list,但 list 永远不会改变。 list 使用构造函数new ListNode(arr [0])进行初始化,但在此之后,唯一正在更改的变量是 selectedNode list.next 甚至没有代码可以更改为某些内容。

那么返回列表如何返回完整的链表?

3 个答案:

答案 0 :(得分:4)

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

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

&#13;
&#13;
function linkedList(arr){
  return arr.reduceRight((next, value) => ({value, next}), null);
}

l = [3, 1, 2, 3, 4, 5];

console.log(linkedList(l));
&#13;
&#13;
&#13;

对于这样一个简单的对象,你不需要课程ListNode