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级联下拉列表实例代码(自写)
May 10 Javascript
javascript与jquery中跳出循环的区别总结
Nov 04 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
Mar 28 Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 Javascript
jQuery加密密码到cookie的实现代码
Apr 18 jQuery
浅谈Vuex的状态管理(全家桶)
Nov 04 Javascript
详解JavaScript中的数组合并方法和对象合并方法
May 11 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 Javascript
Vue 中使用 typescript的方法详解
Feb 17 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
Mar 09 Javascript
详解如何在Javascript中使用Object.freeze()
Oct 18 Javascript
原生js拖拽功能制作滑动条实例代码
Feb 05 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生成xml简单实例代码
2009/12/16 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
js Function类型
2011/12/04 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
深入理解python函数递归和生成器
2016/06/06 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
简单实现python聊天程序
2018/04/01 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
python 进程的几种创建方式详解
2019/08/29 Python
pytorch SENet实现案例
2020/06/24 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
个人求职信范文分享
2014/01/31 职场文书
检讨书范文300字
2015/01/28 职场文书
团代会邀请函
2015/02/02 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
小学大队长竞选稿
2015/11/20 职场文书
多人股份制合作协议书
2016/03/19 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python