将数组转换为链表-来自雄辩的Javascript

将数组转换为链表-来自雄辩的Javascript,javascript,arrays,linked-list,Javascript,Arrays,Linked List,这是书中我无法理解的挑战之一,或者我的大脑无法将其分解。以下是解决方案函数: 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,

这是书中我无法理解的挑战之一,或者我的大脑无法将其分解。以下是解决方案函数:

 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**}}

有人能帮我完成这个过程吗?

基本上,您创建了一个包含两个元素的对象。第一个元素是值,第二个元素是列表的其余部分。在
list={value:20,rest:{value:20,rest:list}}
行中,我们基本上是从头到尾创建列表,所以您总是将列表添加到前面的状态。假设我们有3个元素[10,20,30]。 1.我们从30开始-创建一个名为list的对象,元素值为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部分一样

现在您有了一个列表。(希望我是清楚的)

还有一些额外的日志

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
属性将是该迭代中的
列表的一个副本。

只需一步一步地浏览它,在运行过程中跟踪每个名称/变量的值:

最初:

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
下一步:

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
下一步:

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
此时,循环和函数结束

关键在于何时执行操作。由于这是一种编程风格(与之相反),因此在代码执行期间可以更改与名称(变量)关联的值。因此,当读取
list
并为
list
赋值时,一个新值至关重要。

这里是:

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]);

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

函数列表节点(val,下一个){
this.val=(val==未定义?0:val)
this.next=(next==未定义?null:next)
}
让输入=[1,2,3];
让head=input.reverse().reduce((acc,curr)=>{
如果(acc==null){
acc=新列表节点(当前);
}否则{
acc=新列表节点(当前、acc);
}
返回acc;
},空);

控制台日志(head)这个的输出是什么:
console.log(arrayToList([10,20,30,40,50]){value:10,rest:{value:20,rest:{value:30,rest:[Object]}}
。其余节点在哪里?它们在那里。浏览器的控制台限制了显示的输出量。你可以在控制台中以交互方式检查你的对象,然后看到所有的东西。我喜欢这个。您甚至可以缩短它:
array.reduce((acc,curr)=>newlistnode(curr,acc),null)