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 相关文章推荐
关于图片验证码设计的思考
Jan 29 Javascript
JQuery从头学起第一讲
Jul 04 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
Jun 09 Javascript
jquery 新建的元素事件绑定问题解决方案
Jun 12 Javascript
详解JS函数重载
Dec 04 Javascript
Vue.js路由vue-router使用方法详解
Mar 20 Javascript
用vue和node写的简易购物车实现
Apr 25 Javascript
使用svg实现动态时钟效果
Jul 17 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 Javascript
详解vue-cli中使用rem,vue自适应
May 06 Javascript
p5.js实现故宫橘猫赏秋图动画
Oct 23 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 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中call_user_func_array()函数的用法演示
2012/02/05 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
Python中 Lambda表达式全面解析
2016/11/28 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
军训自我鉴定
2013/12/14 职场文书
医院总经理职责
2013/12/26 职场文书
心理健康教育制度
2014/01/27 职场文书
大学校运会广播稿
2014/02/03 职场文书
党员干部承诺书范文
2014/03/25 职场文书
保健品市场营销方案
2014/03/31 职场文书
员工生日活动方案
2014/08/24 职场文书
超市采购员岗位职责
2015/04/07 职场文书
食堂卫生管理制度
2015/08/04 职场文书