📅  最后修改于: 2023-12-03 15:12:32.400000             🧑  作者: Mango
链表是一种常见的数据结构,它以节点的形式储存数据,每个节点指向下一个节点,最后一个节点则指向 null。JavaScript 中原本没有链表数据结构,但我们可以利用对象来构建链表。
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
this.length = 0;
}
append(value) {
const node = new Node(value);
if (!this.head) {
this.head = node;
this.tail = node;
} else {
this.tail.next = node;
this.tail = node;
}
this.length++;
}
insert(index, value) {
if (index < 0 || index > this.length) {
return false;
}
const node = new Node(value);
if (index === 0) {
node.next = this.head;
this.head = node;
} else if (index === this.length) {
this.tail.next = node;
this.tail = node;
} else {
let current = this.head;
let previous = null;
let i = 0;
while (i < index) {
previous = current;
current = current.next;
i++;
}
previous.next = node;
node.next = current;
}
this.length++;
}
remove(index) {
if (index < 0 || index >= this.length) {
return false;
}
let current = this.head;
if (index === 0) {
this.head = current.next;
if (this.length === 1) {
this.tail = null;
}
} else if (index === this.length - 1) {
while (current.next !== this.tail) {
current = current.next;
}
current.next = null;
this.tail = current;
} else {
let previous = null;
let i = 0;
while (i < index) {
previous = current;
current = current.next;
i++;
}
previous.next = current.next;
}
this.length--;
return current.value;
}
get(index) {
if (index < 0 || index >= this.length) {
return false;
}
let current = this.head;
let i = 0;
while (i < index) {
current = current.next;
i++;
}
return current.value;
}
toArray() {
const array = [];
let current = this.head;
while (current) {
array.push(current.value);
current = current.next;
}
return array;
}
}
以上是使用类建立链表的代码,我们可以通过 append() 方法向链表末尾加入节点,通过 insert() 方法在指定位置插入节点,通过 remove() 方法删除指定位置的节点,通过 get() 方法获取指定位置的节点值,以及通过 toArray() 方法获取链表中所有节点值组成的数组。
const linkedList = new LinkedList();
linkedList.append(1);
linkedList.append(2);
linkedList.append(3);
console.log(linkedList.toArray()); // [1, 2, 3]
linkedList.insert(1, 4);
console.log(linkedList.toArray()); // [1, 4, 2, 3]
linkedList.remove(0);
console.log(linkedList.toArray()); // [4, 2, 3]
console.log(linkedList.get(1)); // 2
以上是一个简单的链表操作示例。
链表相比于数组,可以任意添加或删除任意位置的节点,但受制于指针,查找速度会比数组慢,因此在需要快速查找节点时,不宜使用链表。在需要频繁添加或删除节点时,链表往往比数组更优秀。
链表是 JavaScript 中常见的数据结构,可以通过类来建立。在需要频繁添加或删除节点的场景中,链表更优秀。但在需要快速查找节点的场景中,数组更优秀。