如何在javascript中遍历链表

时间:2018-03-26 23:44:53

标签: javascript

有人分享了这种优雅的方式来创建一个数组的链表。

function removeKFromList(l, k) {
  let list = l.reduceRight((value, next)=>({next, value}), null);
  console.log(list);
}

let l = [3, 1, 2, 3, 4, 5];
let k = 3;

removeKFromList(l, k);

迭代数组(for,filter,map,reduce等)很容易,但链表没有这些功能。我需要迭代以从列表中删除k值。我猜我需要为当前节点创建一个变量并使用while循环,但是没有关于此的文档。我看过一些代理代码,但似乎不必要地复杂。

如何在javascript中迭代链接列表?

1 个答案:

答案 0 :(得分:3)

首先,虽然使用reduce的想法确实很漂亮,但我必须说结果不太好,因为结果节点有一个字段" next"其中的值是一个字段"值"下一个是,即它们被交换。所以,让我们解决一下:

function removeKFromList(l, k) {
    let list = l.reduceRight((value, next)=>({value: next, next: value}), null);
    console.log(list);
}

其次,该函数的名称很糟糕,应该命名为" arrayToLinkedList"或更具暗示性的东西。此外,记录结果没有意义,我们应该返回它。而且,参数k仅是未使用的。解决这些问题:

function arrayToLinkedList(array) {
    return array.reduceRight((prev, cur) => ({ value: cur, next: prev }), null);
}

现在,让我们研究一下如何迭代这个。你怎么看?我会给出一些提示,因为直接给出答案可能不会帮助你学到很多东西:

观察链表本身是:

  • null
  • 具有两个字段的普通对象,一个字段"值"这可以是任何东西,一个领域" next"这是一个链表。

观察上面的(递归)定义是明确定义的并涵盖所有情况。

现在,用它来帮助你。你如何获得第一个价值?那只是myList.value,对吗?现在我如何得到第二个值?通过应用.next,我们获得下一个链表,依此类推。如果next为空,则表示您必须停止。

如果您需要进一步的帮助,请与我们联系。

编辑:我注意到您正在寻找在列表上制作迭代方法的正确方法,并将其添加到原型"或者其他的东西。所以,关于那个:

要通过原型添加实例方法,您需要将链接列表作为类。这将是过于复杂的,除非你真的有充分的理由为此定义一个类(这将创建几个方法和实用程序的东西)。

在我看来,更好的是定义一个函数,它将一个链表作为第一个参数,一个回调函数作为第二个参数,类似于lodash' s .each

function forEachValueInLinkedList(linkedList, callback) {
     // here you loop through all values and call
     // callback(value)
     // for each value.
}

我说这将是最多" javascriptonic"这样做的方法。