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判断图片是否加载完成且获取图片宽度的方法
Apr 09 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
Jun 08 Javascript
js只执行1次的函数示例
Jul 20 Javascript
js事件驱动机制 浏览器兼容处理方法
Jul 23 Javascript
如何使用Bootstrap创建表单
Mar 29 Javascript
JavaScript代码执行的先后顺序问题
Oct 29 Javascript
VueJs 将接口用webpack代理到本地的方法
Nov 27 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
Jan 27 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 Javascript
js prototype深入理解及应用实例分析
Nov 25 Javascript
使用webpack搭建pixi.js开发环境
Feb 12 Javascript
JavaScript中document.activeELement焦点元素介绍
Nov 27 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/11/25 PHP
php中文字母数字验证码实现代码
2008/04/25 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
django接入新浪微博OAuth的方法
2015/06/29 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
AURALog面试题软件测试方面
2013/10/22 面试题
技术经济专业求职信
2014/09/03 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
解放思想大讨论活动总结
2015/05/09 职场文书