【发布时间】:2019-01-08 19:46:15
【问题描述】:
我在一本书上做这个练习,它要求编写一个将数组转换为列表的函数(一个具有“value”属性的对象,它存储值,以及“rest”,它指向下一个值)。
以下是书中给出的解决方案:
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, 30]));
// → {value: 10, rest: {value: 20, rest: {value: 30, rest: null}}}
这是我想出的解决方案:
function arrayToList(array){
var list = {value: null, rest: null};
var tempList={value: array[array.length-1], rest: null};
for(var i=array.length-2; i>=0;i--){
list.value = array[i];
list.rest = tempList;
tempList = list;
}
return list;
};
console.log(arrayToList([10, 20, 30]));
但这会产生如下所示的结果:
{value: 10, rest: {value: 10, rest: {value: 10, …}}}
它适用于由 2 个元素组成的数组以及任何超过该元素的数组,就会发生这个 10 秒的循环。我试图剖析代码以查看发生这种情况的确切位置……这似乎是将列表分配给 tempList 的位置。
谁能给我解释一下怎么回事?
【问题讨论】:
-
为什么在 for 循环中调用 array.length-2?它应该是 array.length-1 就像示例一样。
-
Lloyd Nicholson,我这样做是因为我已经在循环之外做了 array.length-1 元素。在循环开始时将其设置为 array.length-2 元素的“rest”值。
标签: javascript arrays list data-structures linked-list