首先,虽然使用reduce的想法确实很美,但我必须说结果不太好,因为结果节点有一个值为“next”的字段和一个值为“next”的字段“value”,即它们被交换。那么让我们解决这个问题:
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
, or
- 一个具有两个字段的普通对象,一个字段“value”可以是任何内容,一个字段“next”是一个链接列表。
请注意,上述(递归)定义是明确定义的并且涵盖了所有情况。
现在,用它来帮助你。你如何获得第一个值?那将是简单的myList.value
, 正确的?现在我如何获得第二个值?通过应用.next
,我们得到下一个链表,依此类推。如果next
为空,你知道你必须停止。
如果您需要进一步的帮助,请告诉我。
EDIT:我注意到您正在寻找正确的方法来在列表上创建迭代方法,并带有“将其添加到原型”之类的想法。那么,关于这一点:
要通过原型添加实例方法,您需要链接列表是一个类。这将过于复杂,除非您确实有充分的理由为此定义一个类(这将围绕它创建多个方法和实用程序)。
在我看来,最好只定义一个函数,将一个链表作为第一个参数,将回调函数作为第二个参数,类似于 lodash 的.each
:
function forEachValueInLinkedList(linkedList, callback) {
// here you loop through all values and call
// callback(value)
// for each value.
}
我想说这将是最“javascriptic”的方式来做到这一点。