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

yizhihongxing

下面我详细讲解一下在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日

相关文章

  • 基于node的tcp客户端和服务端的简单通信

    下面是关于基于node的TCP客户端和服务端的简单通信的攻略: 一、 学习TCP网络协议和socket 在学习TCP客户端和服务端通信前,需要先了解TCP网络协议和socket编程。TCP/IP(Transmission Control Protocol/Internet Protocol)网络协议是Internet网络的基础协议,它规定了网络通信中数据的传…

    node js 2023年6月8日
    00
  • 使用Typescript和ES模块发布Node模块的方法

    发布Node模块需要满足以下要求: 代码必须是符合Node.js CommonJS规范的。 需要编译工具把你的TypeScript代码编译成JavaScript。 编译后的代码需要经过压缩和优化,最后才能发布到npm上。 在代码中引用外部依赖需要使用ES模块而不能使用CommonJS。 在此,我们提供一份使用 TypeScript和ES模块发布Node模块的…

    node js 2023年6月8日
    00
  • Nodejs中session的简单使用及通过session实现身份验证的方法

    一、什么是session session,即会话,在Node.js中属于Web应用的内部机制,它记录了用户在应用程序中的会话状态。服务器在给客户端返回响应时,会随之返回一个sessionID,该ID会在客户端被记录下来。客户端之后每次访问服务器时,都会携带着这个sessionID一同发送给服务器,以识别当前访问者的身份。 二、Nodejs中session的简…

    node js 2023年6月8日
    00
  • 使用nodejs分离html文件里的js和css详解

    使用Node.js分离HTML文件中的JS和CSS,通常需要以下步骤: 安装依赖 使用Node.js分离HTML文件中的JS和CSS,需要通过安装一些Node.js的依赖来实现。具体可以使用以下命令安装: npm install cheerio //用于解析html文件 npm install fs //用于读取和写入文件 npm install path …

    node js 2023年6月8日
    00
  • Postman xmysql不切换环境缓存数据到本地

    针对这个问题,我需要分几个方面来进行说明。 Postman 首先,我们需要了解一下Postman的基本使用,Postman是一款常用的API接口测试工具,可以模拟HTTP请求,方便我们对API进行接口测试。在使用Postman时,我们需要先创建一个环境变量,可以存储API接口中的一些参数,如URL、header参数和body参数等。创建好环境变量之后,我们可…

    node js 2023年6月8日
    00
  • 浅谈js中子页面父页面方法 变量相互调用

    浅谈JS中子页面父页面方法变量相互调用 在前端开发中,经常会涉及到页面嵌套的问题,比如一个主页面嵌套多个子页面。在这样的情况下,子页面需要实现某些功能,需要调用主页面的方法或者获取主页面的变量。下面将通过两个示例详细讲解JS中子页面和父页面方法变量相互调用的方法。 示例一 在该示例中,页面A嵌套了页面B。我们需要在页面B中调用页面A中的方法。 首先,在页面A…

    node js 2023年6月8日
    00
  • Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解

    Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解 项目需求与背景 本项目是一个电商网站,需要实现商品列表的分页、排序、筛选和添加购物车功能。其中,商品列表由后端Node.js服务器提供接口,前端Vue框架进行页面渲染和交互。 技术栈与工具 前端框架:Vue.js 后端服务器:Node.js 数据库:MySQL 开发工具:Visual Stu…

    node js 2023年6月8日
    00
  • 基于javascript实现获取最短路径算法代码实例

    获取最短路径是图论领域的基础问题之一,在程序开发过程中也经常遇到相关需求。本篇攻略主要介绍如何基于javascript实现获取最短路径算法。 什么是最短路径算法 最短路径算法指的是在图论中寻找两点之间的最短路径的算法。该算法主要应用于路由算法、地图导航、网络传输等。 最短路径算法的实现方式有多种,比如迪杰斯特拉算法、弗洛伊德算法和贝尔曼-福德算法等。其中迪杰…

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