Node.js环境下JavaScript实现单链表与双链表结构

下面我详细讲解一下在Node.js环境下如何实现单链表与双链表结构。

什么是链表

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含两个部分:数据和指向下一个节点的指针。一般分为单向链表和双向链表两种,下面我们将分别介绍如何在Node.js环境下实现这两种链表结构。

单向链表

单向链表的每个节点只有一个指针,指向下一个节点。它的优点是插入和删除节点的时间复杂度为O(1),缺点是访问节点的时间复杂度为O(n)。

实现思路

我们首先需要创建一个链表类,包括链表的头部节点和节点数量。在该类中还需要实现链表的增、删、改、查等基本操作,具体思路如下:

  1. 创建Node类,表示链表中的节点,包括节点的数据和指向下一个节点的指针。
  2. 创建LinkedList类,表示链表,包括链表的头部节点和节点数量。
  3. 在LinkedList类中,实现链表的增、删、改、查等基本操作。

具体代码如下:

// Node类表示链表中的节点
class Node {
  constructor(element) {
    this.element = element;
    this.next = null;
  }
}

// LinkedList类表示链表
class LinkedList {
  constructor() {
    this.head = null; // 头部节点
    this.length = 0; // 节点数量
  }

  // 链表添加节点
  append(element) {
    let node = new Node(element),
        current;

    if (this.head === null){ // 如果链表为空
        this.head = node;
    } else {
        current = this.head;

        while(current.next){
            current = current.next;
        }

        current.next = node;
    }
    this.length++; // 更新节点数量
  }

  // 链表删除节点
  removeAt(position) {
    if (position > -1 && position < this.length) {
      let current = this.head, // 当前节点
          previous, // 上一个节点
          index = 0; // 记录节点位置

      if (position === 0) { // 如果删除的是头部节点
        this.head = current.next;
      } else {
        while (index++ < position) { // 遍历链表,查找要删除的节点
          previous = current;
          current = current.next;
        }

        previous.next = current.next; //将上一个节点的指针指向删除节点的下一个节点
      }

      this.length--; // 更新节点数量

      return current.element;
    } else {
      return null;
    }
  }

  // 链表查找节点
  findIndex(element) {
    let current = this.head,
        index = -1;

    while (current) {
      if (element === current.element) {
        return index;
      }

      index++;
      current = current.next;
    }

    return -1;
  }

  // 链表插入节点
  insert(position, element) {
    if (position >= 0 && position <= this.length) {
      let node = new Node(element),
          current = this.head,
          previous,
          index = 0;

      if (position === 0) {
        node.next = current;
        this.head = node;
      } else {
        while (index++ < position) {
          previous = current;
          current = current.next;
        }

        previous.next = node;
        node.next = current;

      }

      this.length++;

      return true;
    } else {
      return false;
    }
  }
}

示例说明

我们可以通过以下代码,使用LinkedList类创建链表,并进行增、删、改、查等操作。

const list = new LinkedList();

list.append('a'); // 添加节点
list.append('b');
list.append('c');

console.log(list.length); // 打印节点数量

console.log(list.findIndex('a')); // 查找节点的位置

list.insert(2, 'd'); // 在指定位置插入节点

list.removeAt(1); // 删除制定位置的节点

双向链表

双向链表的每个节点有两个指针,一个指向前一个节点,一个指向后一个节点。它的优点是访问和删除节点的时间复杂度为O(1),缺点是插入节点的时间复杂度为O(n)。

实现思路

我们同样需要创建一个链表类,包括链表的头部节点、尾部节点和节点数量。在该类中还需要实现链表的增、删、改、查等基本操作,具体思路如下:

  1. 创建Node类,表示链表中的节点,包括节点的数据和指向前一个节点和后一个节点的指针。
  2. 创建DoublyLinkedList类,表示双向链表,包括链表的头部节点、尾部节点和节点数量。
  3. 在DoublyLinkedList类中,实现链表的增、删、改、查等基本操作。

具体代码如下:

// Node类表示链表中的节点
class Node {
  constructor(element) {
    this.element = element;
    this.next = null;
    this.prev = null;
  }
}

// DoublyLinkedList类表示双向链表
class DoublyLinkedList {
  constructor() {
    this.head = null; // 头部节点
    this.tail = null; // 尾部节点
    this.length = 0; // 节点数量
  }

  // 链表添加节点
  append(element) {
    let node = new Node(element);

    if (this.head === null) {
      this.head = node;
      this.tail = node;
    } else {
      this.tail.next = node;
      node.prev = this.tail;
      this.tail = node;
    }

    this.length++; // 更新节点数量
  }

  // 链表删除节点
  removeAt(position) {
    if (position > -1 && position < this.length) {
      let current = this.head,
          previous,
          index = 0;

      if (position === 0) {
        this.head = current.next;

        if (this.length === 1) {
          this.tail = null;
        } else {
          this.head.prev = null;
        }

      } else if (position === this.length - 1) {
        current = this.tail;
        this.tail = current.prev;
        this.tail.next = null;

      } else {
        while (index++ < position) {
          previous = current;
          current = current.next;
        }

        previous.next = current.next;
        current.next.prev = previous;
      }

      this.length--;

      return current.element;
    } else {
      return null;
    }
  }

  indexOf(element) {
    let current = this.head,
        index = 0;

    while(current) {
      if (element === current.element) {
        return index;
      }

      index++;
      current = current.next;
    }

    return -1;
  }

  // 链表插入节点
  insert(position, element) {
    if (position >= 0 && position <= this.length) {
      let node = new Node(element),
          current = this.head,
          previous,
          index = 0;

      if (position === 0) {
        if (!this.head) {
          this.head = node;
          this.tail = node;
        } else {
          node.next = current;
          current.prev = node;
          this.head = node;
        }
      } else if (position === this.length) {
        current = this.tail;
        current.next = node;
        node.prev = current;
        this.tail = node;
      } else {
        while (index++ < position) {
          previous = current;
          current = current.next;
        }

        previous.next = node;
        node.prev = previous;
        node.next = current;
        current.prev = node;
      }

      this.length++;

      return true;
    } else {
      return false;
    }
  }
}

示例说明

我们可以通过以下代码,使用DoublyLinkedList类创建双向链表,并进行增、删、改、查等操作。

const list = new DoublyLinkedList();

list.append('a'); // 添加节点
list.append('b');
list.append('c');

console.log(list.length); // 打印节点数量

console.log(list.indexOf('a')); // 查找节点的位置

list.insert(2, 'd'); // 在指定位置插入节点

list.removeAt(1); // 删除指定位置的节点

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js环境下JavaScript实现单链表与双链表结构 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • AngularJS实现分页显示数据库信息

    下面是AngularJS实现分页显示数据库信息的完整攻略: 1. 编写后端接口 首先需要编写一个后端接口,用于从后端服务器获取数据库中的信息。这可以使用任何后端语言来完成,如Java、Node.js、PHP等。例如,我们使用Node.js 和 Express框架编写一个获取所有数据的接口: const express = require(‘express’)…

    node js 2023年6月8日
    00
  • 使用vue-cli初始化项目时运行‘npm run dev’报错及解决

    当使用vue-cli来初始化项目时,执行npm run dev命令时有可能出现各种类型的错误。这些错误可能会包括npm包的依赖关系、配置问题、端口占用等。在本文中,我们将介绍如何识别并解决其中的一些常见错误。 错误1:The System Cannot Find the Path Specified 这个错误通常意味着你没有正确设置项目的路径。例如,当你在W…

    node js 2023年6月8日
    00
  • 轻松创建nodejs服务器(7):阻塞操作的实现

    下面我将详细讲解“轻松创建nodejs服务器(7):阻塞操作的实现”的完整攻略。 一、背景知识 在JavaScript中,所有的IO操作(例如读写文件,网络请求等)都是异步的。这是因为JavaScript是单线程的,在进行IO操作时,如果采用阻塞模式,就会使整个线程停止执行,无法做其他事情,这显然是非常不利的。为了避免这种情况发生,JavaScript采用了…

    node js 2023年6月8日
    00
  • NodeJS实现客户端js加密

    关于“NodeJS实现客户端js加密”的攻略,我可以给你讲解一下。 首先需要明确的是,对于前端加密的需求,我们可以使用一些现成的js代码库来实现加密。但是,由于js代码是公开的,所以在一定程度上不能保证加密的安全性。所以,在这种情况下,我们需要将加密操作转移到后端进行处理,将加密后的数据传回前端。那么,我们就可以使用NodeJS来实现这种加密操作。 下面就是…

    node js 2023年6月8日
    00
  • 浅谈Angular的12个经典问题

    下面是详细的讲解“浅谈Angular的12个经典问题”的完整攻略。 1. Angular是什么? Angular是一个JavaScript框架,由谷歌公司开发并维护,用于构建Web应用程序。它采用了MVVM架构模式,提供了一套完整的工具和库,使开发人员能够轻松地创建可扩展的单页面Web应用程序。 2. Angular与AngularJS有什么区别? Angu…

    node js 2023年6月8日
    00
  • puppeteer实现html截图的示例代码

    下面是针对“puppeteer实现html截图的示例代码”的完整攻略: 一、前置准备 首先需要Node.js环境以及Puppeteer库,可以通过在终端中运行以下命令来安装Puppeteer: npm install puppeteer 安装完成后,我们就可以开始编写代码了。 二、实现代码 在Puppeteer中,我们可以使用page.screenshot(…

    node js 2023年6月8日
    00
  • 基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架

    针对这个话题,我将从以下几个方面进行详细讲解: 背景介绍 接口配置建模框架的设计思路 接口配置建模框架实现 示例说明 背景介绍 前后端分离已经是现今Web开发的趋势,而在这种架构下,前后端要通过API来进行交互。如何对API的调用进行抽象和封装就变得尤为重要。本文将深入探讨基于NodeJS的前后端分离架构下的一种轻量级的接口配置建模框架的设计和实现过程。 接…

    node js 2023年6月8日
    00
  • nodejs事件的监听与触发的理解分析

    Node.js是基于事件驱动的异步编程,使用事件可以让不同的模块进行通信,从而对系统进行解耦。与其他编程语言相比,Node.js的事件模型具有高效、简明、易用等特点。本文将详细讲解Node.js中事件的监听与触发的理解分析。 事件监听 事件监听是指程序监听某个事件的发生,当这个事件发生时,程序会执行相应的回调函数。Node.js中可以使用eventEmitt…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部