在JavaScript数据结构与算法——链表详解(上)中,我们探讨了一下链表的定义、实现原理以及单链表的实现。接下来我们进一步了解一下链表的其他内容。

1、双向链表

双向链表实现原理图:

与单向链表不同的是,图中增加了小线部分,每一个节点增加了一个指向前驱节点的属性,这样就实现了双向链表。
双向链表中,删除节点不需要知道待删除节点的前驱节点,只要把待删除节点指向前驱节点的属性指向NULL,同时把前驱节点指向待删除节点的后继节点即可,这样在删除节点时更高效。结合原理图比较好理解一点,双向链表中,删除节点原理如下图:

增加节点原理如下图:

2、JS实现双向链表

以下代码基于JavaScript数据结构与算法——链表详解(上)中的代码修改,文章末尾会附上完整代码。
从原理图可知,我们应该先给节点添加previous属性,可通过修改Node类实现:

2.1、Node类修改
// Created by xiaoqiang on 24/04/2018.
class Node {constructor (element) {this.element = elementthis.next = nullthis.previous = null}
}
2.2、LinkedList类修改
class LinkedList {constructor () {this.header = new Node('header')        // 头节点}// 查找元素find (item) {let currNode = this.headerwhile (currNode.element !== item) {currNode = currNode.next}return currNode}// 用于返回最后一个节点findLast () {let currNode = this.headerwhile (currNode.next !== null) {currNode = currNode.next}return currNode}// 插入节点insert (item, newElement) {let newNode = new Node(newElement)let current = this.find(item)newNode.next = current.nextnewNode.previous = currentcurrent.next = newNode}// 删除节点remove (item) {let currNode = this.find(item)if (currNode.next !== null) {currNode.previous.next = currNode.nextcurrNode.next.previous = currNode.previouscurrNode.next = nullcurrNode.previous = null}}// 显示链表display () {let currNode = this.headerwhile(currNode.next !== null) {console.log(currNode.next.element)currNode = currNode.next}}// 反向显示链表displayReverse () {let currNode = this.headercurrNode = this.findLast()while (currNode.previous !== null) {console.log(currNode.element)currNode = currNode.previous}}
}

链表中的方法可根据需要添加。

2.3、测试实例修改:
let books = new LinkedList()
console.log('开始插入操作')
books.insert('header', 'JavaScript')
books.insert('JavaScript', 'PHP')
books.insert('PHP', 'Nodejs')
console.log('插入后的链表数据为:')
books.display()
console.log('开始进行移除操作')
books.remove('PHP')
console.log('移除后PHP后的链表的数据为:')
books.display()
console.log('反向显示链表:')
books.displayReverse()
2.3、双向链表完整代码
// Created by xiaoqiang on 24/04/2018.
class Node {constructor (element) {this.element = elementthis.next = nullthis.previous = null}
}class LinkedList {constructor () {this.header = new Node('header')        // 头节点}// 查找元素find (item) {let currNode = this.headerwhile (currNode.element !== item) {currNode = currNode.next}return currNode}// 用于返回最后一个节点findLast () {let currNode = this.headerwhile (currNode.next !== null) {currNode = currNode.next}return currNode}// 插入节点insert (item, newElement) {let newNode = new Node(newElement)let current = this.find(item)newNode.next = current.nextnewNode.previous = currentcurrent.next = newNode}// 删除节点remove (item) {let currNode = this.find(item)if (currNode.next !== null) {currNode.previous.next = currNode.nextcurrNode.next.previous = currNode.previouscurrNode.next = nullcurrNode.previous = null}}// 显示链表display () {let currNode = this.headerwhile(currNode.next !== null) {console.log(currNode.next.element)currNode = currNode.next}}// 反向显示链表displayReverse () {let currNode = this.headercurrNode = this.findLast()while (currNode.previous !== null) {console.log(currNode.element)currNode = currNode.previous}}
}let books = new LinkedList()
console.log('开始插入操作')
books.insert('header', 'JavaScript')
books.insert('JavaScript', 'PHP')
books.insert('PHP', 'Nodejs')
console.log('插入后的链表数据为:')
books.display()
console.log('开始进行移除操作')
books.remove('PHP')
console.log('移除后PHP后的链表的数据为:')
books.display()
console.log('反向显示链表:')
books.displayReverse()
2.4、运行及结果

使用node运行此js文件,结果如下:

3、循环链表

循环链表实现原理如下图:

原理比双向链表更简单一些,有兴趣可以尝试实现一下,也可以给以上实现的链表类多添加一些方法,加深理解。
至此,JavaScript数据结构与算法——链表详解(下)完结,有错误欢迎指出。

JavaScript数据结构与算法——链表详解(下)相关推荐

  1. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

  2. JavaScript数据结构与算法——队列详解(下)

    接下来会借助本人另一篇文章JavaScript数据结构与算法--队列详解(上)中实现的队列类及其方法实现一个应用. 配对问题 需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以 ...

  3. JavaScript数据结构与算法——列表详解(下),基于Nodejs实现一个列表应用

    1.上篇回顾: 上篇我们实现了一个列表类,并添加了一些属性,实现了比较多的方法,本文章将与大家一起使用列表实现一个图书借阅查询系统.需要使用JavaScript数据结构与算法--列表详解(上)中写好的 ...

  4. JavaScript数据结构与算法——数组详解(下)

    1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...

  5. JavaScript数据结构与算法——列表详解(上)

    列表是一组有序的数据,每个数组中的数据项称为元素.数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型.列表中可以保存不定数量的元素,实际使用时元素的数 ...

  6. JavaScript数据结构与算法——栈详解

    1.栈基本知识 栈是一种特殊的列表,栈的元素只能通过列表的一端访问,这一端成为栈顶,栈具有先进后出的特点,要想访问栈底的元素,就必须将上边的元素先拿出来.对栈的操作主要是入栈和出栈,通过push()和 ...

  7. JavaScript数据结构与算法——队列详解(上)

    队列基本知识 队列是一种与列表很像的数据结构,只是队列只能在尾部插入元素,在队首删除元素.队列用于存放按顺序排列的元素,先进先出,就像食堂排队一样,后来的只能排在后面,先来的先拿饭,一种井然有序的感觉 ...

  8. JavaScript数据结构与算法——数组详解(上)

    1.JS中的数组 JS中的数组是一个特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数,但是这些数字索引会在内部转换成字符串类型(因为JS对象中的属性名必须是字符串).数组在JS中只是一种 ...

  9. c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列详解

    前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...

最新文章

  1. 首发 | 13篇京东CVPR 2019论文!你值得一读~ 技术头条
  2. UC伯克利出品,深度强化学习最新课程已上线
  3. What is Listing in SAP Retail?
  4. 二叉树遍历算法的六种c语言实现 递归与非递归
  5. 常见的集成逻辑门(CMOS\TTL\ECL)
  6. 学计算机必须学会模拟电路,2016年广西大学计算机与电子信息学院1304电路分析基础与模拟电子线路之电路分析基础复试笔试仿真模拟题...
  7. SLAM GMapping(8)重采样
  8. 【翻译+整理】.NET Core的介绍
  9. 漫谈 - 从技术业务骨干走向管理
  10. Atitit 架构之道 之 可读性可维护性架构之道 提升效率架构之道 attilax著 艾龙 著 1.1. Hybrid架构 1 1.2. 分层架构是使用最多的架构模式 Layers模式 也称Tie
  11. 在ftp服务器上搜索文件名,ftp服务器上搜索文件
  12. 2018年7-8月学习有效反馈
  13. 金蝶K3WISE V14.0注册方法
  14. canvas特效收集
  15. 经典CNN图像分类网络汇总
  16. 服务器先装系统还是先做热备,安装ibm服务器双机热备操作系统图文详细步骤.doc...
  17. 机器学习——统计学三大相关性系数(pearson、spearman、kendall)
  18. 哪种投影仪好用?家用电视投影仪哪种好
  19. STM32学习之I2C协议(读写EEPROM)
  20. 压力传感器/压力变送器分类

热门文章

  1. Learn Python the Hard Way: 字典
  2. 解决MySQL不允许从远程访问的方法
  3. PHP Fatal error: Class 'Mongo' not found
  4. 传惠普下周公布webOS平台最终命运
  5. 用 rsync sersync两个工具实现文件备份及同步 一
  6. 通过 SSH 端口转发实现异地内网服务器互通
  7. JDBC , 使用java来控制mysql。JavaWeb开发的分层设计-三层架:DAO层设计,连接池使用,类加载使用,配置...
  8. python使用tkinter做界面之颜色
  9. 线程同步synchronized理解
  10. 线性规划与网络流24题 负载平衡问题