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 相关文章推荐
DWR Ext 加载数据
Mar 22 Javascript
js 程序执行与顺序实现详解
May 13 Javascript
判断复选框是否被选中的两种方法
Jun 04 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
Oct 10 Javascript
jQuery实现checkbox全选的方法
Jun 10 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
Sep 09 Javascript
Bootstrap每天必学之导航条(二)
Mar 01 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
Aug 10 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
Bootstrap模态框插件使用详解
May 11 Javascript
jquery多级树形下拉菜单的实例代码
Jul 09 jQuery
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 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
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
JS中offset和匀速动画详解
2018/02/06 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
python多进程实现进程间通信实例
2017/11/24 Python
python实现树形打印目录结构
2018/03/29 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
IRO美国官网:法国服装品牌
2018/03/06 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
技术经理的自我评价范文
2013/12/03 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
副总经理任命书
2014/06/05 职场文书
免职通知
2015/04/23 职场文书
离婚起诉状范本
2015/05/19 职场文书
故意伤害辩护词
2015/05/21 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL