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 相关文章推荐
extjs 为某个事件设置拦截器
Jan 15 Javascript
JavaScript实现拼音排序的方法
Nov 20 Javascript
鼠标经过tr时,改变tr当前背景颜色
Jan 13 Javascript
js数组依据下标删除元素
Apr 14 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
Jun 05 Javascript
jQuery实现Tab选项卡切换效果简单演示
Nov 23 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
详解JS异步加载的三种方式
Mar 07 Javascript
Angularjs上传图片实例详解
Aug 06 Javascript
解决layer 动态加载select 失效的问题
Sep 18 Javascript
详解elementUI中input框无法输入的问题
Apr 27 Javascript
jQuery-App输入框实现实时搜索
Nov 19 jQuery
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 文件写入和读取(必看篇)
2017/05/22 PHP
Javascript中的数学函数
2007/04/04 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
jquery选择器简述
2015/08/31 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Android分包MultiDex策略详解
2017/10/30 Python
python适合人工智能的理由和优势
2019/06/28 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
雅虎笔试题(字符串操作)
2015/03/24 面试题
硕士研究生个人求职信
2013/12/04 职场文书
写给老师的表扬信
2014/01/21 职场文书
收银员岗位职责
2014/02/07 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
《识字五》教学反思
2014/03/01 职场文书
给校长的建议书600字
2014/05/15 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
2015高考寄语集锦
2015/02/27 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
光荣之路观后感
2015/06/12 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript