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 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
JS获取节点的兄弟,父级,子级元素的方法
Jan 09 Javascript
JS实现将人民币金额转换为大写的示例代码
Feb 13 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
Dec 01 Javascript
浅谈jquery点击label触发2次的问题
Jun 12 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
Bootstrap3 内联单选和多选框
Dec 29 Javascript
js遍历json的key和value的实例
Jan 22 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
Aug 02 Javascript
AngularJS实现的base64编码与解码功能示例
May 17 Javascript
详解vue 项目白屏解决方案
Oct 31 Javascript
详解Vue前端对axios的封装和使用
Apr 01 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编程与应用
2006/10/09 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
微信小程序仿美团城市选择
2018/06/06 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
2018/07/25 jQuery
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
Python 模拟购物车的实例讲解
2017/09/11 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
项目管理计划书
2014/01/09 职场文书
精彩自我鉴定
2014/01/16 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
宝塔更新Python及Flask项目的部署
2022/04/11 Python