【问题标题】:Converting array to Linked list - from Eloquent Javascript将数组转换为链表 - 来自 Eloquent Javascript
【发布时间】:2015-11-29 05:59:45
【问题描述】:

这是我无法理解的书中的挑战之一,或者我的大脑无法分解它。下面是求解函数:

 function arrayToList(array) {
  var list = null;
  for (var i = array.length - 1; i >= 0; i--)
    list = {value: array[i], rest: list};
  return list;
}

console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}

所以我们反向循环数组,所以第一次列表应该是:

list = {value:20, rest:{value:20, rest:**mind blows here**}}

谁能帮我完成这个过程?

【问题讨论】:

    标签: javascript arrays linked-list


    【解决方案1】:

    这里是:

    function L(val){
        this.val = val;
        this.next = null;
    }
    
    //We have to develop
    /*
    L{
        val:1,
        next:{
            val:2,
            next: {
                val:3,
                next: {
                    val:4,
                    next:null
                }
            }
        }
    }
    */
    
    function createL(a){
        let node, temp;
        for(let i=a.length-1; i >= 0; i--){
            if(!node)
                node = new L(a[i]);
            else {
                temp = new L(a[i]);
                temp.next = node;
                node = temp;
            }
        }
        return node;
    }
    
    createL([1,2,3,4]);
    

    【讨论】:

      【解决方案2】:

      只需单步执行,随时跟踪每个名称/变量的值:

      最初:

      array = [10, 20]
      list = null
      i = 1
      

      下一步:

      array = [10, 20]
      list = {value: 20, rest: null}
      i = 1
      

      下一步:

      array = [10, 20]
      list = {value: 20, rest: null}
      i = 0
      

      下一步:

      array = [10, 20]
      list = {value: 10, rest: {value: 20, rest: null}}
      i = 0
      

      此时循环和函数结束。

      关键是何时 操作被执行。由于这是imperative 风格的编程(相对于(pure) functional),与名称(变量)关联的值可以在代码执行期间更改。因此,何时读取list 并为list 分配新值至关重要。

      【讨论】:

      • 这个的输出是什么:console.log(arrayToList([10, 20, 30, 40, 50])); 当我执行这个时,我得到:{ value: 10, rest: { value: 20, rest: { value: 30, rest: [Object] } } }。剩下的节点在哪里??
      • 他们在那里。您的浏览器控制台限制了它显示的输出量。您可以在控制台中以交互方式检查您的对象并查看所有内容。
      【解决方案3】:

      reducer 可用于从数组元素创建链表。

      function ListNode(val, next) {
        this.val = (val === undefined ? 0 : val)
        this.next = (next === undefined ? null : next)
      }
      
      let input = [1, 2, 3];
      
      
      let head = input.reverse().reduce((acc, curr) => {
        if (acc == null) {
          acc = new ListNode(curr);
      
        } else {
          acc = new ListNode(curr, acc);
        }
        return acc;
      }, null);
      
      console.log(head);

      【讨论】:

      • 我喜欢这个。你甚至可以缩短它:array.reduce((acc, curr) => new ListNode(curr, acc), null)
      【解决方案4】:

      基本上,您创建一个包含 2 个元素的对象。第一个元素是值,第二个元素是列表的其余部分。在list = {value:20, rest:{value:20, rest:list}} 行中,我们基本上是从头到尾创建列表,因此您始终添加列表以前的状态。所以假设我们有 3 个元素 [10,20,30]。 1. 我们从 30 开始 - 创建一个名为 list 的对象,其中元素 value = 30,list = null。 2. 我们在 20 - 获取看起来像这样 {value:30, rest:null} 的列表对象并将其放置在具有 20 值的新对象中,所以我们有{value: 20, rest:{**old list** --> {value:30, list:null} }} 现在我们将 list 的引用更改为指向新创建的对象。 list = {value: 20, rest:{**old list** --> {value:30, list:null} }} 3. 我们做的和2一样。

      现在你有一个列表。 (希望我很清楚)

      【讨论】:

        【解决方案5】:

        加上一些额外的日志

        function arrayToList(array) {
            var list = null;
            for (var i = array.length - 1; i >= 0; i--) {
                console.log(i);//2, then 1
                console.log(array[i]);//20, then 10
                list = {
                    value: array[i],
                    rest: list//null, then {value:20, rest: null}
                };
            }
            return list;
        }
        console.log(arrayToList([10, 20]));
        //{ value: 10, rest: { value: 20, rest: null } }
        

        您可以看到,虽然您正在反向迭代列表,但 list 对象的 value 属性将是最后一个迭代的数组元素。 rest 属性将是该迭代中 list 的副本。

        【讨论】:

          猜你喜欢
          • 2023-03-14
          • 2016-05-24
          • 2020-04-17
          • 1970-01-01
          • 2020-04-30
          • 2014-07-13
          • 2011-09-23
          • 2014-01-29
          • 1970-01-01
          相关资源
          最近更新 更多