📜  用于删除双向链表中节点的 Javascript 程序(1)

📅  最后修改于: 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() 方法用于删除链表中第一个存储指定值的节点。

请注意,该方法只会删除第一个存储指定值的节点,若要删除所有节点,需要使用循环来遍历整个链表。