数组

时间:2017-11-27 18:11:37

标签: javascript recursion linked-list

我正在研究Eloquent Javascript中的示例,我似乎无法生成一个有效的解决方案来递归地从一个数组转到一个链表。

第一种(迭代)方法似乎有效。我对递归感到难过。推动正确的方向将非常感激。这是我到目前为止编写的代码:

function arrayToList(arr) {
    var retObj = {};
    var current = retObj;
    for (var i = 0; i < arr.length; i++) {
        current.value = arr[i];
        if (arr[i + 1] === undefined) {
            current.rest = null;
        } else {
            current.rest = {};
        }
        current = current.rest;
    }
    return retObj;
}

function recArrayToList(arr, obj) {
    if (arr.length === 0) {
        return 'DONE!';
    }
    obj.value = arr[0];
    obj.rest = {};
    return recArrayToList(arr.slice(1), obj.rest);
}

1 个答案:

答案 0 :(得分:0)

由于它是一个单链表(意思是它只有一种方式),你也需要传入根目录。你可以将它作为一个你不需要第一次传递的默认参数。

同样,您也可以将obj作为可选参数进行自我初始化,使您的初始调用仅为recArrayToList(someArr)

&#13;
&#13;
function recArrayToList(arr, obj, root) {
        if (arr.length === 0) {
            obj.rest = null;
            return root;
        }
        
        if (!obj) {
          obj = {};
        }

        if (!root) {
          root = obj;
        }

        obj.value = arr[0];
        obj.rest = {};
        return recArrayToList(arr.slice(1), obj.rest, root);
    }
    
let current = recArrayToList([1,2,3,4,5]);

while(current.rest) {
  console.log(current.value);
  current = current.rest;
}
&#13;
&#13;
&#13;

你也可以用一些更紧凑的JS(有些人不喜欢其中一些约定)来缩小它:

&#13;
&#13;
function recArrayToList(arr, obj, root) {
        if (arr.length === 0) {
            obj.rest = null;
            return root;
        }
        
        obj = obj || {};
        root = root || obj;
        Object.assign(obj, { value: arr.shift(), rest: {} });
        return recArrayToList(arr, obj.rest, root);
    }
    
let current = recArrayToList([1,2,3,4,5]);

while(current.rest) {
  console.log(current.value);
  current = current.rest;
}
&#13;
&#13;
&#13;