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代码
Aug 17 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
Jquery结合HTML5实现文件上传
Jun 25 Javascript
微信小程序开发实战教程之手势解锁
Nov 18 Javascript
JS实现的简易拖放效果示例
Dec 29 Javascript
Bootstrap fileinput组件封装及使用详解
Mar 10 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
Aug 03 Javascript
jQuery实现图片简单轮播功能示例
Aug 13 jQuery
在vue使用clipboard.js进行一键复制文本的实现示例
Jan 15 Javascript
vue 项目build错误异常的解决方法
Apr 22 Javascript
解决vue请求接口第一次成功,第二次失败问题
Sep 08 Javascript
vue项目实现多语言切换的思路
Sep 17 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利用cookie实现访问次数统计代码
2011/05/19 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
Django中使用group_by的方法
2015/05/26 Python
python去除文件中重复的行实例
2018/06/29 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
python urllib和urllib3知识点总结
2021/02/08 Python
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
初三化学教学反思
2014/01/23 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
六五普法心得体会2016
2016/01/21 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
Win11查看设备管理器
2022/04/19 数码科技
CentOS MySql8 远程连接实战
2022/04/19 MySQL