是否有可能在JS中实现arrayToList函数而不是向后单步执行数组?

时间:2018-02-11 15:49:17

标签: javascript linked-list



function arrayToList(array) {
      var list = null;
      for (var i = array.length - 1; i >= 0; i--) //How to implement it if i = 0?
        list = {value: array[i], rest: list};
      return list;
    }




arr.reverse - 不是报价。我很好奇如果我们从数组[0]中逐步执行数组怎么办呢?或者只有当我们向后跨越数组时才能完成JS中的这个任务?

3 个答案:

答案 0 :(得分:1)

您可以缩小对象并在末尾分配null



function arrayToList(array) {
    var list = {};
    array.reduce((o, v, i, a) => (o.value = v, o.rest = i + 1 === a.length ? null : {}), list);
    return list;
}

console.log(arrayToList([4, 5, 6, 7]));

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:1)

你可以在没有循环的情况下使用递归代替。

function arrayToListRecursive(arr) {
  return (!arr.length)
    ? null
    : {
        value: arr[0],
        rest: arrayToListRecursive(arr.slice(1))
      }
}


function arrayToListLoop(arr) {
  let list = null;
  for (let i = 1; i <= arr.length; i++) {
    list = { value: arr[arr.length - i], rest: list };
  }
  return list
}

console.log(
  arrayToListRecursive([1, 2, 3, 4])
)

console.log(
  arrayToListLoop([1, 2, 3, 4])
)
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>

答案 2 :(得分:1)

技巧是为列表头和当前节点使用两个单独的指针:

function arrayToList(a) {
    var list = {}, p = list;
    for (let x of a) {
        p.value = x;
        p.rest = {};
        p = p.rest;
    }
    return list;
}


console.log(arrayToList([11,22,33]))

要使最后一个指针无效,你需要三个指针:

function arrayToList(a) {
    var list = {}, p = list, q;
    for (let x of a) {
        p.value = x;
        p.rest = {};
        q = p;
        p = p.rest;
    }
    q.rest = null;
    return list;
}