要使用JavaScript实现链表数据结构,需要考虑以下几个方面:
- 链表的基本结构
- 链表的基本操作(插入、删除、遍历等)
- JavaScript 实现数据结构的具体步骤
下面我将逐一阐述。
链表的基本结构
链表是由一系列节点所组成的数据结构,每个节点都保存着下一个节点的引用关系。链表可以是单向的,也可以是双向的。单向链表的节点只有指向下一个节点的指针,而双向链表的节点则同时有指向下一个节点和上一个节点的指针。
通常我们用一个类来表示链表的节点,这个类至少包括以下两个属性:
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
data
:存储节点的数据next
:指向下一个节点的指针
链表的基本操作
链表的基本操作包括插入、删除和遍历。下面我们分别看一下每个操作的实现。
插入
链表的插入操作一般有两种情况:
- 在某个节点之后插入一个节点
- 在链表的头部插入一个节点
在某个节点之后插入一个节点
在某个节点之后插入一个节点,需要先找到这个节点,然后将新节点的 next
指向这个节点的后继节点,然后将这个节点的 next
指向新节点。
class LinkedList {
constructor() {
this.head = null;
}
// 在某个节点之后插入一个节点
insertAfter(targetNode, newNode) {
newNode.next = targetNode.next;
targetNode.next = newNode;
}
}
在链表的头部插入一个节点
在链表的头部插入一个节点,只需要将新节点的 next
指向链表的头节点,然后让新节点成为链表的头节点即可。
class LinkedList {
constructor() {
this.head = null;
}
// 在链表的头部插入一个节点
insertAtHead(newNode) {
newNode.next = this.head;
this.head = newNode;
}
}
删除
链表的删除操作也分为两种情况:
- 删除某个节点
- 删除整个链表
删除某个节点
删除某个节点需要找到这个节点的前一个节点,然后将这个节点的前继节点的 next
指向这个节点的后继节点即可。
class LinkedList {
constructor() {
this.head = null;
}
// 删除某个节点
remove(node) {
let prev = null;
let cur = this.head;
while (cur !== node) {
prev = cur;
cur = cur.next;
}
if (prev) {
prev.next = cur.next;
} else {
this.head = cur.next;
}
}
}
删除整个链表
删除整个链表只需要将链表的头节点设为 null 即可。
class LinkedList {
constructor() {
this.head = null;
}
// 删除整个链表
clear() {
this.head = null;
}
}
遍历
遍历链表可以通过循环遍历每个节点来实现。其中,从链表的头节点开始,每次循环将当前节点的下一个节点作为下一次循环的当前节点,直到循环到链表的末尾。
class LinkedList {
constructor() {
this.head = null;
}
// 遍历链表
traverse(fn) {
let cur = this.head;
while (cur) {
fn(cur);
cur = cur.next;
}
}
}
JavaScript 实现数据结构的具体步骤
下面是使用 JavaScript 实现链表数据结构的具体步骤:
- 定义一个类来表示链表的节点。
- 定义一个类来表示链表,这个类至少需要包含一个指向链表头节点的属性。
- 在链表类的方法中实现插入、删除和遍历等操作。
下面是一个完整的链表实现示例:
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
}
// 在某个节点之后插入一个节点
insertAfter(targetNode, newNode) {
newNode.next = targetNode.next;
targetNode.next = newNode;
}
// 在链表的头部插入一个节点
insertAtHead(newNode) {
newNode.next = this.head;
this.head = newNode;
}
// 删除某个节点
remove(node) {
let prev = null;
let cur = this.head;
while (cur !== node) {
prev = cur;
cur = cur.next;
}
if (prev) {
prev.next = cur.next;
} else {
this.head = cur.next;
}
}
// 删除整个链表
clear() {
this.head = null;
}
// 遍历链表
traverse(fn) {
let cur = this.head;
while (cur) {
fn(cur);
cur = cur.next;
}
}
}
示例说明
下面给出两个示例说明链表的使用。
示例 1:在某个节点之后插入一个节点
const list = new LinkedList();
list.insertAtHead(new Node(3));
list.insertAtHead(new Node(2));
list.insertAtHead(new Node(1));
console.log('before insert:');
list.traverse(node => console.log(node.data)); // 1 2 3
const targetNode = list.head.next;
const newNode = new Node(4);
list.insertAfter(targetNode, newNode);
console.log('after insert:');
list.traverse(node => console.log(node.data)); // 1 2 3 4
上面的示例创建了一个链表,并在链表的头部插入了三个节点。然后找到链表的第二个节点,并在它之后插入了一个新节点。最后输出插入后的链表内容。
示例 2:删除某个节点
const list = new LinkedList();
list.insertAtHead(new Node(3));
list.insertAtHead(new Node(2));
list.insertAtHead(new Node(1));
console.log('before remove:');
list.traverse(node => console.log(node.data)); // 1 2 3
const targetNode = list.head.next;
list.remove(targetNode);
console.log('after remove:');
list.traverse(node => console.log(node.data)); // 1 3
上面的示例创建了一个链表,并在链表的头部插入了三个节点。然后找到链表的第二个节点,并删除它。最后输出删除后的链表内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用JavaScript实现链表的数据结构的代码 - Python技术站