JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】


Posted in Javascript onApril 28, 2020

本文实例讲述了JavaScript 双向链表操作。分享给大家供大家参考,具体如下:

一个 双向链表(doubly linked list) 是由一组称为节点的顺序链接记录组成的链接数据结构。每个节点包含两个字段,称为链接,它们是对节点序列中上一个节点和下一个节点的引用

开始节点和结束节点的上一个链接和下一个链接分别指向某种终止节点,通常是前哨节点或null,以方便遍历列表。如果只有一个前哨节点,则列表通过前哨节点循环链接。它可以被概念化为两个由相同数据项组成的单链表,但顺序相反。

class DNode {
 constructor(val) {
  this.val = val;
  this.prev = null;
  this.next = null;
 }
}

增加节点

function add(el) {
  var currNode = this.head;
  while (currNode.next != null) {
    currNode = currNode.next;
  }
  var newNode = new DNode(el);
  newNode.next = currNode.next;
  currNode.next = newNode;
}

查找

function find(el) {
  var currNode = this.head;
  while (currNode && currNode.el != el) {
    currNode = currNode.next;
  }
  return currNode;
}

插入

function (newEl, oldEl) {
  var newNode = new DNode(newEl);
  var currNode = this.find(oldEl);
  if (currNode) {
    newNode.next = currNode.next;
    newNode.prev = currNode;
    currNode.next = newNode;
  } else {
    throw new Error('未找到指定要插入节点位置对应的值!')
  }
}

展示

// 顺序
function () {
  var currNode = this.head.next;
  while (currNode) {
    console.log(currNode.el);
    currNode = currNode.next;
  }
}

// 逆序
function () {
  var currNode = this.head;
  currNode = this.findLast();
  while (currNode.prev != null) {
    console(currNode.el);
    currNode = currNode.prev;
  }
}

删除

function (el) {
  var currNode = this.find(el);
  if (currNode && currNode.next != null) {
    currNode.prev.next = currNode.next;
    currNode.next.prev = currNode.prev;
    currNode.next = null;
    currNode.previous = null;
  } else {
    throw new Error('找不到要删除对应的节点');
  }
}

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
accesskey 提交
Jun 26 Javascript
浅析Bootstrap验证控件的使用
Jun 23 Javascript
同步异步动态引入js文件的几种方法总结
Sep 23 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 Javascript
bootstrap组件之按钮式下拉菜单小结
Jan 19 Javascript
Three.js的使用及绘制基础3D图形详解
Apr 27 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
Jun 28 jQuery
JS 学习总结之正则表达式的懒惰性和贪婪性
Jul 03 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
Aug 17 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
May 01 Javascript
Vue使用虚拟dom进行渲染view的方法
Dec 26 Javascript
JS 创建对象的模式实例小结
Apr 28 #Javascript
JavaScript console的使用方法实例分析
Apr 28 #Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 #Javascript
JavaScript Date对象功能与用法学习记录
Apr 28 #Javascript
JavaScript 链表定义与使用方法示例
Apr 28 #Javascript
Vue 3.0 全家桶抢先体验
Apr 28 #Javascript
React生命周期原理与用法踩坑笔记
Apr 28 #Javascript
You might like
php中常用编辑器推荐
2007/01/02 PHP
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
Joomla开启SEF的方法
2016/05/04 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
PHP对象实例化单例方法
2017/01/19 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
Express的路由详解
2015/12/10 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
python邮件发送smtplib使用详解
2020/06/16 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
tensorflow 查看梯度方式
2020/02/04 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
python Zmail模块简介与使用示例
2020/12/19 Python
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
英文简历中的自荐信范文
2013/12/14 职场文书
委托书的写法
2014/09/16 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js