getElementAt(index) { // 检查越界值 if (index >= 0 && index <= this.count) { let current = this.head; for (let i = 0; i < index && current != null; i++) { current = current.next; } return current; }
// 显式声明返回值 returnundefined; } }
移除指定位置的元素
移除第一个元素:要做的就是让 head 指向列表的第二个元素。我们将用 current 变量创建一个对链表第一个元素的引用。这样 current 变量就是对链表中第一个元素的引用。如果把 head 赋为 current.next,就会移除第一个元素。
getElementAt(index) { // 检查越界值 if (index >= 0 && index <= this.count) { let current = this.head; // 迭代整个链表直到目标 index。结束循环时,node 元素将是 index 位置元素的引用。 for (let i = 0; i < index && current != null; i++) { current = current.next; } return current; } returnundefined; }
/** * 从链表的特定位置移除一个元素。 * @param {number} index - 要移除的元素的索引。 * @returns {any} - 被移除的元素的值。 */ removeAt(index) { // 检查越界值 if (index >= 0 && index < this.count) { let current = this.head; // 移除第一项 if (index === 0) { this.head = current.next; } else { const previous = this.getElementAt(index - 1); current = previous.next; // 将 previous 与 current 的下一项链接起来:跳过 current,从而移除它 previous.next = current.next; } this.count--; return current.element; } returnundefined; // 如果索引无效,则返回 undefined } }
验证:
1 2 3 4 5 6 7 8 9
const list = newLinkedList(); list.push(5); list.push(10); list.push(15); list.push(20);
indexOf(element) { let current = this.head; for (let i = 0; i < this.count && current != null; i++) { if (this.equalsFn(element, current.element)) { return i; } current = current.next; } return -1; } }
一如既往,需要一个变量来帮助我们循环访问列表。该变量是 current,它的初始值是 head。
然后迭代元素,从 head(索引 0) 开始,直到链表长度(count 变量)为止。为了确保不会发生运行时错误,我们可以验证下 current 变量是否为 null 或 undefined。
toString() { if (this.head === null) { return''; } let objString = `${this.head.element}`; let current = this.head.next; for (let i = 1; i < this.size() && current !== null; i++) { objString = `${objString},${current.element}`; current = current.next; } return objString; } }