JavaScript数据结构之双向链表定义与使用方法示例


Posted in Javascript onOctober 27, 2017

本文实例讲述了JavaScript数据结构之双向链表定义与使用方法。分享给大家供大家参考,具体如下:

双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。

双向链表提供了两种迭代列表的方法:从头到尾,或者反过来。我们也可以访问一个特定节点的下一个或前一个元素。在单向链表中,如果迭代列表时错过了要找的元素,就需要回到列表起点,重新开始迭代。这是双向链表的一个优点。

function DoubleLink(){
  var length=0;//链表长度
  var head=null;//头结点的引用
  var tail=null;//尾节点的引用
  function Node(e){
    this.element=e;
    this.next=null;
    this.previous=null;
  }
  this.insertAt=function(position,e){//在任意位置添加节点
    if(position>=0&&position<=length){//判断边界
      var node=new Node(e);
      var current=head;
      var previous;
      var index=0;
      if(position==0){//在第一个位置添加
        if(!head){//链表为空的时候添加第一个节点
          head=node;
          tail=node;
        }else{
          current=head;
          node.next=current;
          current.previous=node;
          head=node;
        }
      }else if(position==length){//在链表末尾添加
        current=tail;
        current.next=node;
        node.previous=current;
        tail=node;
      }else{
        while(index<position){
          previous=current;
          current=current.next;
          index++;
        }
        previous.next=node;
        node.previous=previous;
        node.next=current;
        current.previous=node;
      }
      length++;
      return true;
    }else{
      return null;
    }
  }
  this.removeAt=function(position){//删除任意位置的节点
    if(position>-1&&position<length){//边界判断
      var current=head;
      var previous;
      var index=0;
      if(position==0){//删除第一个位置的节点
        head=current.next;
        if(length==1){//如果只有一项
          tail=null;
        }else{
          head.previous=null;
        }
      }else if(position==length-1){//删除最后一项
        current=tail;
        tail=current.previous;
        tail.next=null;
      }else{
        while(index<position){
          previous=current;
          current=current.next;
          index++;
        }
        previous.next=current.next;
        current.next.previous=previous;
      }
      length--;
      return current.element;
    }else{
      return null;
    }
  }
  this.indexOf=function(e){//获取节点位置,从头开始数
    var current=head;
    var index=0;
    while(current){
      if(current.element==e){
        return index;
      }
      current=current.next;
      index++;
      if(index>=length)return null;
    }
  }
  this.isEmpty=function(){//判断链表是否为空
    return length==0;
  }
  this.mylength=function(){//链表长度
    return length;
  }
  this.print1=function(){//从头到尾打印链表
    var current=head;
    while(current){
      console.log(current.element);
      current=current.next;
    }
  }
  this.print2=function(){//从尾到头打印链表
    var current=tail;
    while(current){
      console.log(current.element);
      current=current.previous;
    }
  }
  this.getHead=function(){//获取头节点
    return head;
  }
  this.getTail=function(){//获取尾节点
    return tail;
  }
}
var link=new DoubleLink();//实例化一个对象
link.insertAt(0,'d');
link.insertAt(1,'e');
link.insertAt(2,'f');
link.insertAt(3,'g');
link.insertAt(4,'h');
link.insertAt(5,'i');
link.insertAt(6,'j');
link.insertAt(7,'k');
link.removeAt(7);
link.removeAt(0);
link.print1();//efghij
link.print2();//jihgfe
console.log(link.getHead());//e
console.log(link.getTail());//j
console.log(link.indexOf('f'));//1

运行结果:

JavaScript数据结构之双向链表定义与使用方法示例

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

Javascript 相关文章推荐
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
Apr 16 Javascript
jquery 缓存问题的几个解决方法
Nov 11 Javascript
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
JavaScript探测CSS动画是否已经完成的方法
Aug 30 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
Sep 08 Javascript
JavaScript实现瀑布流以及加载效果
Feb 11 Javascript
JavaScript队列函数和异步执行详解
Jun 19 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
微信小程序JS加载esmap地图的实例详解
Sep 04 Javascript
ElementUI多个子组件表单的校验管理实现
Nov 07 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
Aug 13 Javascript
js实现鼠标点击飘爱心效果
Aug 19 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 #jQuery
动态统计当前输入内容的字节、字符数的实例详解
Oct 27 #Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
Oct 27 #Javascript
node 利用进程通信实现Cluster共享内存
Oct 27 #Javascript
vue中v-model动态生成的实例详解
Oct 27 #Javascript
微信小程序 input输入及动态设置按钮的实现
Oct 27 #Javascript
js通过Date对象实现倒计时动画效果
Oct 27 #Javascript
You might like
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
jQuery live
2009/05/15 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中常见的数据类型小结
2015/08/29 Python
分析Python中解析构建数据知识
2018/01/20 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
python的数学算法函数及公式用法
2020/11/18 Python
python爬虫智能翻页批量下载文件的实例详解
2021/02/02 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
文秘专业应届生求职信范文
2013/11/14 职场文书
招商经理岗位职责
2013/11/16 职场文书
优秀毕业生自荐信范文
2014/01/01 职场文书
维修工先进事迹
2014/05/29 职场文书
小学课外阅读总结
2014/07/09 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
运动会广播稿100字
2015/08/19 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技