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 相关文章推荐
Javascript小技巧之生成html元素
May 15 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
Jun 09 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
May 05 Javascript
AngularJS入门教程之Scope(作用域)
Jul 27 Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
Apr 28 Javascript
JS实现将对象转化为数组的方法分析
Jan 21 Javascript
解决vue 子组件修改父组件传来的props值报错问题
Nov 09 Javascript
ant-design-vue 快速避坑指南(推荐)
Jan 21 Javascript
基于Vue全局组件与局部组件的区别说明
Aug 11 Javascript
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
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操作xml代码
2010/06/17 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python进阶之自定义对象实现切片功能
2019/01/07 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
python二进制文件的转译详解
2019/07/03 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
行政助理岗位职责范文
2013/12/03 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
化工专业自荐书
2014/06/16 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
优秀纪检干部材料
2014/08/27 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
2015年环卫工作总结
2015/04/28 职场文书