JS双向链表实现与使用方法示例(增加一个previous属性实现)


Posted in Javascript onJanuary 31, 2019

本文实例讲述了JS双向链表实现与使用方法。分享给大家供大家参考,具体如下:

前面一篇讲述了《JS基于对象的链表实现与使用方法》,这里的双向链表通过增加一个previous属性实现。

单链表中若需要查找某一个元素时,必须从第一个元素开始进行查找,而双向链表除开头节点和最后一个节点外每个节点中储存有两个指针,这连个指针分别指向前一个节点的地址和后一个节点的地址,这样无论通过那个节点都能够寻找到其他的节点。

原理如下图所示:

JS双向链表实现与使用方法示例(增加一个previous属性实现)

示例代码:

/*双向链表
* */
function Node(element) {
  this.element = element;
  this.next = null;
  this.previous = null;//双向链表在这里需要增加一个previous属性
}
function LList() {
  this.head = new Node("head");
  this.find = find;
  this.insert = insert;
  this.display = display;
  this.remove = remove;
  this.findLast = findLast;
  this.dispReverse = dispReverse;//将链表反转
}
function dispReverse() {
  var currNode = this.head;
  currNode = this.findLast();
  var nodestr = "";
  while (!(currNode.previous == null)) {
    nodestr += " "+currNode.element;
    currNode = currNode.previous;
  }
  console.log("将链表反转后: "+nodestr);
}
function findLast() {
  var currNode = this.head;
  while (!(currNode.next == null)) {
    currNode = currNode.next;
  }
  return currNode;
}
function remove(item) {
  var currNode = this.find(item);
  if (!(currNode.next == null)) {
    currNode.previous.next = currNode.next;
    currNode.next.previous = currNode.previous;
    currNode.next = null;
    currNode.previous = null;
  }
}
// findPrevious is no longer needed
/*function findPrevious(item) {
 var currNode = this.head;
 while (!(currNode.next == null) &&
 (currNode.next.element != item)) {
 currNode = currNode.next;
 }
 return currNode;
 }*/
function display() {
  var currNode = this.head;
  var nodestr = "";
  while (!(currNode.next == null)) {
    nodestr += " "+currNode.next.element;
    currNode = currNode.next;
  }
  console.log(nodestr);
}
function find(item) {
  var currNode = this.head;
  while (currNode.element != item) {
    currNode = currNode.next;
  }
  return currNode;
}
function insert(newElement, item) {
  var newNode = new Node(newElement);
  var current = this.find(item);
  newNode.next = current.next;
  newNode.previous = current;//双向链表在这里需要设置新节点previous属性
  current.next = newNode;
}
var cities = new LList();
cities.insert("Conway", "head");
cities.insert("Russellville", "Conway");
cities.insert("Carlisle", "Russellville");
cities.insert("Alma", "Carlisle");
cities.display();//Conway Russellville Carlisle Alma
cities.remove("Carlisle");
cities.display();//Conway Russellville Alma
cities.dispReverse();// Alma Russellville Conway

这里使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码,可得如下运行结果:

JS双向链表实现与使用方法示例(增加一个previous属性实现)

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

Javascript 相关文章推荐
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
Jun 26 Javascript
javascript实现根据身份证号读取相关信息
Dec 17 Javascript
向JavaScript的数组中添加元素的方法小结
Oct 24 Javascript
JS验证逗号隔开可以是中文字母数字
Apr 22 Javascript
jQuery中delegate()方法的用法详解
Oct 13 Javascript
Bootstrap 网站实例之单页营销网站
Oct 20 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
Jul 18 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
微信小程序module.exports模块化操作实例浅析
Dec 20 Javascript
layui添加动态菜单与选项卡
Jul 26 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
May 13 Javascript
JS基于对象的链表实现与使用方法示例
Jan 31 #Javascript
JS栈stack类的实现与使用方法示例
Jan 31 #Javascript
JQuery中queue方法用法示例
Jan 31 #jQuery
JavaScript两种计时器的实例讲解
Jan 31 #Javascript
JavaScript对JSON数组简单排序操作示例
Jan 31 #Javascript
实例讲解v-if和v-show的区别
Jan 31 #Javascript
详解使用angular框架离线你的应用(pwa指南)
Jan 31 #Javascript
You might like
PHP 中的批处理的实现
2007/06/14 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
python sqlite的Row对象操作示例
2019/09/11 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
舞蹈兴趣小组活动总结
2014/07/07 职场文书
python flask框架快速入门
2021/05/14 Python
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL