如何在javascript中遍历链表

如何在javascript中遍历链表,javascript,Javascript,有人分享了这种从数组创建链表的优雅方法 函数removeKFromListl,k{ 让list=l.reduceRightvalue,next=>{next,value},null; 控制台日志列表; } 设l=[3,1,2,3,4,5]; 设k=3; 移除kFromlistl,k 首先,尽管使用reduce的想法确实很好,但我必须说结果不是很好,因为结果节点的值旁边有一个字段,下一个值旁边有一个字段,即它们被交换。那么,让我们来解决这个问题: function removeKFromList

有人分享了这种从数组创建链表的优雅方法

函数removeKFromListl,k{ 让list=l.reduceRightvalue,next=>{next,value},null; 控制台日志列表; } 设l=[3,1,2,3,4,5]; 设k=3;
移除kFromlistl,k 首先,尽管使用reduce的想法确实很好,但我必须说结果不是很好,因为结果节点的值旁边有一个字段,下一个值旁边有一个字段,即它们被交换。那么,让我们来解决这个问题:

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,或 一个普通对象,有两个字段,一个字段值可以是任何内容,下一个字段是链表。 请注意,上面的递归定义定义定义良好,涵盖了所有情况

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

如果你需要进一步的帮助,请告诉我

编辑:我注意到您正在寻找一种正确的方法来在列表上创建一个迭代方法,并将其添加到原型或其他东西中。关于这一点:

要通过原型添加实例方法,您需要将链接列表作为类。这将过于复杂,除非您确实有很好的理由为此定义一个类,该类将围绕它创建多个方法和实用程序

在我看来,最好只定义一个函数,将一个链表作为第一个参数,将回调函数作为第二个参数,这与lodash的类似。每个函数:


首先,尽管使用reduce的想法确实很好,但我必须说结果不是很好,因为生成的节点在值的旁边有一个字段,在值的旁边有一个字段值,在值的旁边有一个字段值,也就是说,它们被交换。那么,让我们来解决这个问题:

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,或 一个普通对象,有两个字段,一个字段值可以是任何内容,下一个字段是链表。 请注意,上面的递归定义定义定义良好,涵盖了所有情况

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

如果你需要进一步的帮助,请告诉我

编辑:我注意到您正在寻找一种正确的方法来在列表上创建一个迭代方法,并将其添加到原型或其他东西中。关于这一点:

要通过原型添加实例方法,您需要将链接列表作为类。这将过于复杂,除非您确实有很好的理由为此定义一个类,该类将围绕它创建多个方法和实用程序

在我看来,最好只定义一个函数,将一个链表作为第一个参数,将回调函数作为第二个参数,这与lodash的类似。每个函数:


我认为这将是最具javascriptonic风格的方法。

您构建了这个链表。给它那些你渴望的方法吧。我还不是javascript专家。我会使用list.prototype.MyMethod来完成吗?我不确定我是否使用了正确的术语aka methodNo,因为它们不是共享原型的实例,只是普通对象。您可以直接将该方法分配给列表,或者更确切地说,分配给每个节点对象。也许您应该开始编写静态函数,将列表作为其第一个参数,也可以正确处理null(空列表)。没有相关文档,因为您的链接列表不是本机数据类型。你可能会发现很多教程,它们甚至不一定是JS,链表的结构和迭代它们的方法是相同的

好的,那些看起来真的很糟糕。是的,您可以在ListNode构造函数上使用原型方法。我建议尝试创建一个要返回的新列表,而不是操作旧节点,这会简单得多。给它那些你渴望的方法吧。我还不是javascript专家。我会使用list.prototype.MyMethod来完成吗?我不确定我是否使用了正确的术语aka methodNo,因为它们不是共享原型的实例,只是普通对象。您可以直接将该方法分配给列表,或者更确切地说,分配给每个节点对象。也许您应该开始编写静态函数,将列表作为其第一个参数,也可以正确处理null(空列表)。没有相关文档,因为您的链接列表不是本机数据类型。你可能会发现很多教程——它们甚至不一定是JS,链表的结构和迭代方法在任何地方都是一样的。好吧,那些看起来确实很糟糕。是的,您可以在ListNode构造函数上使用原型方法。我建议尝试创建一个要返回的新列表,而不是操作旧的节点,这会简单得多。value,next=>{value:next,next:value}=next,value=>{value,next}@Jaromanda漂亮的捕获!然而,现在我想起来了,虽然你的想法比我的好,但我认为还有一个更好的方法可以避免代码进一步模糊,那就是以类似于MDN文档的方式使用reduceRight回调中的参数,即prev和cur,让我来修复它。谢谢你激励我改变。非常感谢你!我同意你的解决方案更清晰,特别是对于其他程序员来说。今晚我会在你的帮助下解决这个问题!再次感谢你把它弄明白了!递归非常简单!伟大的work@TylerL美好的如果你认为我的答案有帮助,请考虑接受我的答案“绿色检查”。value,Next={value:Next,Next:value }= Next,value = > {值,Next } JAROMANDA尼斯catch!然而,现在我想起来了,虽然你的想法比我的好,但我认为还有一个更好的方法可以避免代码进一步模糊,那就是以类似于MDN文档的方式使用reduceRight回调中的参数,即prev和cur,让我来修复它。谢谢你激励我改变。非常感谢你!我同意你的解决方案更清晰,特别是对于其他程序员来说。今晚我会在你的帮助下解决这个问题!再次感谢你把它弄明白了!递归非常简单!伟大的work@TylerL美好的如果您认为我的答案有帮助,请考虑接受我的答案绿色复选标记。