面试题答案
一键面试JavaScript代码实现
class ListNode {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
}
addNode(value) {
const newNode = new ListNode(value);
if (!this.head) {
this.head = newNode;
} else {
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
}
}
[Symbol.iterator]() {
let current = this.head;
return {
next() {
if (current) {
const value = current.value;
current = current.next;
return { done: false, value };
} else {
return { done: true };
}
}
};
}
}
如何使该数据结构符合可迭代协议
在JavaScript中,一个对象要成为可迭代对象,需要实现Symbol.iterator
方法。在上述代码中,LinkedList
类实现了Symbol.iterator
方法。这个方法返回一个迭代器对象,该迭代器对象有一个next
方法。每次调用next
方法时,它会返回一个包含done
和value
属性的对象。done
表示迭代是否结束,value
表示当前迭代的值。通过这种方式,LinkedList
实例就成为了可迭代对象,可以使用for...of
循环等迭代机制。
这种设计在实际应用中的优势
- 代码简洁:使用可迭代对象,在遍历链表时可以使用
for...of
循环等简洁的语法,提高代码可读性和编写效率。例如:
const list = new LinkedList();
list.addNode(1);
list.addNode(2);
list.addNode(3);
for (const value of list) {
console.log(value);
}
- 可组合性:可迭代对象可以方便地与其他支持迭代协议的函数或库进行组合。例如,可以使用
Array.from
将链表转换为数组,或者使用map
、filter
等数组方法对链表数据进行处理。
const list = new LinkedList();
list.addNode(1);
list.addNode(2);
list.addNode(3);
const arrayFromList = Array.from(list);
const filteredList = Array.from(list).filter(value => value > 1);
- 延迟计算:迭代器实现的延迟计算特性,使得在处理大型链表时,可以按需获取数据,而不是一次性加载所有数据,从而提高内存使用效率。