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 相关文章推荐
jqTransform form表单美化插件使用方法
Jul 05 Javascript
JS简单的轮播的图片滚动实例
Jun 17 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
Jul 07 Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 Javascript
JS中SetTimeout和SetInterval使用初探
Mar 23 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
Vue keep-alive实践总结(推荐)
Aug 31 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
Jan 31 jQuery
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
Feb 08 Javascript
基于vue-cli3和element实现登陆页面
Nov 13 Javascript
js函数柯里化的方法和作用实例分析
Apr 11 Javascript
JavaScript Tab菜单实现过程解析
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
Terran兵种对照表
2020/03/14 星际争霸
967 个函式
2006/10/09 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
JS实现页面打印功能
2017/03/16 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
angularjs实现天气预报功能
2020/06/16 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
Python编写屏幕截图程序方法
2015/02/18 Python
浅谈Python浅拷贝、深拷贝及引用机制
2016/12/15 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
升职自荐信范文
2013/10/05 职场文书
文秘专业毕业生就业推荐信
2013/11/08 职场文书
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
音乐器材管理制度
2014/01/31 职场文书
《理想》教学反思
2014/02/17 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
师德师风学习材料
2014/12/19 职场文书
护士业务学习心得体会
2016/01/25 职场文书
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle