📅  最后修改于: 2023-12-03 14:56:19.652000             🧑  作者: Mango
本文将介绍一个用于删除双向链表中节点的 JavaScript 程序。双向链表是一种常见的数据结构,它可以在节点中存储数据,并且每个节点都有指向前一个节点和后一个节点的指针。删除链表中的节点是一个经常需要执行的操作,因此我们需要一个高效且易于使用的方法。本文将提供一个简单易用的 JavaScript 函数,旨在帮助程序员更轻松地删除双向链表中的节点。
/**
* @class Node 双向链表节点
* @param {any} value 节点存储的值
* @param {Node} prevNode 前一个节点
* @param {Node} nextNode 后一个节点
*/
class Node {
constructor(value, prevNode, nextNode) {
this.value = value;
this.prev = prevNode;
this.next = nextNode;
}
}
/**
* @class DoublyLinkedList 双向链表
*/
class DoublyLinkedList {
constructor() {
this.head = null;
this.tail = null;
}
/**
* addNode 在链表末尾添加节点
* @param {any} value 节点存储的值
*/
addNode(value) {
const newNode = new Node(value, null, null);
if (this.head === null) {
this.head = newNode;
this.tail = newNode;
} else {
newNode.prev = this.tail;
this.tail.next = newNode;
this.tail = newNode;
}
}
/**
* deleteNode 删除链表中指定值的第一个节点
* @param {any} value 节点存储的值
*/
deleteNode(value) {
let currentNode = this.head;
// 找到需要删除的节点
while (currentNode !== null) {
if (currentNode.value === value) {
break;
}
currentNode = currentNode.next;
}
if (currentNode === null) {
return;
}
// 如果被删除的节点是头节点或尾节点
if (currentNode.prev === null) {
this.head = currentNode.next;
} else {
currentNode.prev.next = currentNode.next;
}
if (currentNode.next === null) {
this.tail = currentNode.prev;
} else {
currentNode.next.prev = currentNode.prev;
}
// 删除目标节点以及其前后指针
currentNode.prev = null;
currentNode.next = null;
}
}
使用方法:
const list = new DoublyLinkedList();
list.addNode(1);
list.addNode(2);
list.addNode(3);
list.deleteNode(2); // 删除值为2的节点
其中,addNode()
方法用于在链表末尾添加节点,deleteNode()
方法用于删除链表中第一个存储指定值的节点。
请注意,该方法只会删除第一个存储指定值的节点,若要删除所有节点,需要使用循环来遍历整个链表。