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创建命名空间(namespace)的最简实现
Dec 11 Javascript
JavaScript 基于原型的对象(创建、调用)
Oct 16 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
Jun 16 Javascript
XML文件转化成NSData对象的方法
Aug 12 Javascript
基于jQuery实现动态数字展示效果
Aug 12 Javascript
jQuery实现分隔条左右拖动功能
Nov 21 Javascript
详解vue.js 开发环境搭建最简单攻略
Jun 12 Javascript
vue项目中引入Sass实例方法
Aug 27 Javascript
解决layui laydate 时间控件一闪而过的问题
Sep 28 Javascript
JavaScript享元模式原理与用法实例详解
Mar 09 Javascript
jQuery实现开关灯效果
Aug 02 jQuery
详解vue中在父组件点击按钮触发子组件的事件
Nov 13 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&amp;mysql(一)
2006/10/09 PHP
php正则表达式(regar expression)
2011/09/10 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
php判断linux下程序问题实例
2015/07/09 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
javascript中的new使用
2010/03/20 Javascript
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
小学生成长感言
2014/01/30 职场文书
创建文明学校实施方案
2014/03/11 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
结婚保证书范文
2014/04/29 职场文书
营销团队口号
2014/06/06 职场文书
工作说明书格式
2014/07/29 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
Golang表示枚举类型的详细讲解
2021/09/04 Golang