返回
用 JavaScript 实现链表
前端
2023-12-18 11:37:21
前言
链表作为一种经典的数据结构,在计算机科学和软件开发领域有着广泛的应用。链表的实现方式有很多种,在JavaScript中,我们可以使用对象或数组来实现链表。本文将介绍两种用JavaScript实现链表的方法,分别基于对象和数组,并探讨它们的优缺点。
基于对象的链表实现
基于对象的链表实现方式是将链表的每个节点作为一个对象,节点对象包含两个属性:数据项和指向下一个节点的链接。以下是基于对象的链表实现示例:
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
}
add(data) {
const newNode = new Node(data);
if (this.head === null) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
}
remove(data) {
let current = this.head;
let previous = null;
while (current !== null) {
if (current.data === data) {
if (previous === null) {
this.head = current.next;
} else {
previous.next = current.next;
}
if (current === this.tail) {
this.tail = previous;
}
break;
}
previous = current;
current = current.next;
}
}
find(data) {
let current = this.head;
while (current !== null) {
if (current.data === data) {
return current;
}
current = current.next;
}
return null;
}
print() {
let current = this.head;
while (current !== null) {
console.log(current.data);
current = current.next;
}
}
}
基于数组的链表实现
基于数组的链表实现方式是将链表的每个节点存储在一个数组中,数组的每个元素包含两个值:数据项和指向下一个节点的索引。以下是基于数组的链表实现示例:
class LinkedList {
constructor() {
this.data = [];
this.next = [];
}
add(data) {
this.data.push(data);
this.next.push(this.data.length - 1);
}
remove(data) {
const index = this.data.indexOf(data);
if (index === -1) {
return;
}
this.data.splice(index, 1);
this.next.splice(index, 1);
for (let i = index; i < this.next.length; i++) {
this.next[i]--;
}
}
find(data) {
const index = this.data.indexOf(data);
if (index === -1) {
return null;
}
return this.data[index];
}
print() {
for (let i = 0; i < this.data.length; i++) {
console.log(this.data[i]);
}
}
}
比较
基于对象的链表实现和基于数组的链表实现各有优缺点。基于对象的链表实现更加直观,节点之间通过对象的引用相连接,但是需要更多的内存空间。基于数组的链表实现更加紧凑,内存占用更少,但是需要额外的数组来存储节点之间的链接。
总结
本文介绍了两种用JavaScript实现链表的方法,分别基于对象和数组。基于对象的链表实现更加直观,基于数组的链表实现更加紧凑。开发者可以根据具体需求选择合适的方法来实现链表。