我正在实现一个双向链表作为编程练习的一部分,并且希望允许开发人员使用 for...in
符号来向前和向后遍历它的节点。
在最基本的情况下,数据结构如下所示:
class DoublyLinkedList {
constructor(data) {
if (data) {
this.head = new DoublyLinkedListNode(data)
} else {
this.head = null
}
}
append = (data) => {
if (!this.head) {
this.prepend(data)
} else {
const newTail = new DoublyLinkedListNode(data)
let current = this.head
while(current.next) {
current = current.next
}
current.next = newTail
newTail.prev = current
}
}
}
接下来,我添加了生成器函数:
*values() {
let current = this.head
while (current) {
yield current.data;
current = current.next;
}
}
*valuesBackward() {
let currentForwards = this.head
while (currentForwards.next) {
currentForwards = currentForwards.next
}
const tail = currentForwards
let currentBackwards = tail
while (currentBackwards) {
yield currentBackwards.data
currentBackwards = currentBackwards.prev
}
}
我能够添加一个单一的前向迭代器,只需将以下内容添加到类中:
[Symbol.iterator]() { return this.values()}
我尝试将以下两个内容添加到类中:
iterateForward = () => [Symbol.iterator] = () => this.valuesBackward()
iterateBackward = () => [Symbol.iterator] = () => this.valuesBackward()
然后尝试使用 for (node in list.iterateForward())
迭代,但是这会导致错误 TypeError: undefined is not a function
。
我猜这个错误可以从代码中看出来,所以下一步我尝试了:
iterateForward = () => {
const vals = this.values()
const it = {
[Symbol.iterator]() {
return vals()
}
}
return it
}
这并没有报错,但是迭代没有生效 - 迭代器零次运行。
我缺少什么?有可能实现我想要的吗?