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 相关文章推荐
js 控制页面跳转的5种方法
Sep 09 Javascript
JS 实现导航栏悬停效果
Sep 23 Javascript
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
如何理解Vue的作用域插槽的实现原理
Aug 19 Javascript
详解vue项目首页加载速度优化
Oct 18 Javascript
Vue动态加载异步组件的方法
Nov 21 Javascript
layui表单验证select下拉框实现验证的方法
Sep 05 Javascript
Vue点击切换Class变化,实现Active当前样式操作
Jul 17 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 28 Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
Jun 02 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的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
PHP函数积累总结
2019/03/19 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
售前工程师职业生涯规划
2014/03/02 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
高中课程设置方案
2014/05/28 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书