当前位置:首页 > 日记 > 正文

JavaScript数据结构之双向链表和双向循环链表的实现

JavaScript数据结构之双向链表和双向循环链表的实现

双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。

双向链表提供了两种迭代列表的方法:从头到尾,或者反过来。我们也可以访问一个特定节点的下一个或前一个元素。在单向链表中,如果迭代列表时错过了要找的元素,就需要回到列表起点,重新开始迭代。这是双向链表的一个优点。

双向链表:单向链表只能向着一个方向遍历链表节点,而在节点指针域中增加了前向指针的双向链表,则可以向着两个方向遍历节点。这使得双向链表也可以在任何一个节点遍历整个链表。

function DoublyLinkedList() {   var Node = function(element) {     this.element = element;     this.next = null;     this.prev = null;   };    var length = 0,     head = null,     tail = null;    this.append = function(element){     var node = Node(element),       current,       previous;          if(!head){       head = node;       tail = node;     }else{       current = head;       while(current){         previous = current;         current = current.next;       }        node.next = current;       current.prev = node;       previous.next = node;       node.prev = previous;     }      length++;     return true;   }    this.insert = function(position,element){     if(position > -1 && position < length){       var node = new Node(element),         current = head,         previous,         index = 0;        if(position === 0){          if(!head){           head = node;           tail = node;         }else{           node.next = current;           current.prev = node;           head = node;         }        }else if (position === length -1){         current = tail;         current.next = node;         node.prev = current;       }else {         while(index++ < position){           previous = current;           current = current.next;         }         node.next = current;         previous.next = node;         current.prev = node;         node.prev = previous;       }        length++;       return true;     }else{       return false;     }   };    this.removeAt = function(position){     if(position > -1 && position < length){       var current = head,         index = 0,         previous;        if (position === 0) {         head = current.next;          if(length === 1){           tail = null;         }else{           head.prev = null;         }       }else if(position === length - 1){         current = tail;         tail = current.prev;         tail.next = null;       } else{         while(index++ < position){           previous = current;           current = current.next;         }          previous.next = current.next;         current.next.prev = previous;       };       length-- ;        return current.element;     }else{       return false;     }   };    this.remove = function(element){     var current = head,       previous;      if(current.element === element){       head = current.next;     }     previous = current;     current = current.next;      while(current){       if (current.element = element) {         previous.next = current.next;         current.next.prev = previous;       }else{         previous = current;         current = current.next;       }     }     return false;   };    this.remove = function(){     if (length === 0) {       return false;     };      var current = head,       previous;      if(length === 1){       head = null;       tail = null;       length--;       return current.element;     }      while(current){       previous = current;       current = current.next;     }      previous.next = null;     length--;     return current.element;   };    this.indexOf = function(element){     var current = head,       index = 0;      while(current && index++ < length){       if (current.element === element) {         return index;       };       current = current.next;     }      return false;   };    this.isEmpty = function(){     return length === 0;   };    this.size = function(){     return length;   };    this.toString = function(){     var current = head,       string = '';      while(current){       string += current.element;       current = current.next;     }     return string;   };    this.getHead = function(){     return head;   };    this.getTail = function(){     return tail;   }; } 

双向循环链表:将双向链表的头尾指针相连,就构成了双向循环链表。这种链表从任意一个节点都可以同时向两个方向进行节点遍历,查询节点的速度也是最快的。

/*双向循环链表*/ function DoublyCircularLinkedList(){   var Node = function(element){     this.element = element;     this.next = null;     this.prev = null;   };    var length = 0,     head = null,     tail = null;    this.append = function(element){     var node = new Node(element),       current,       previous;      if (!head) {       head = node;       tail = node;       head.prev = tail;       tail.next = head;     }else{       current = head;        while(current.next !== head){         previous = current;         current = current.next;       }        current.next = node;       node.next = head;       node.prev = current;     };      length++;     return true;   };    this.insert = function(position, element){     if(position >= 0 && position <= length){       var node = new Node(element),         index = 0,         current = head,           previous;        if(position === 0){                  if(!head){            node.next = node;           node.tail = node;           head = node;           tail = node;          }else{            current.prev = node;           node.next = current;           head = node;           node.prev = tail;          }                }else if(position === length){         current = tail;          current.next = node;         node.prev = current;         tail = node;         node.next = head;       }else{          while(index++ < position){           previous = current;           current = current.next;         }          current.prev = node;         node.next = current;         previous.next = node;         node.prev = previous;        }        length++;       return true;     }else{       return false;     }   };    this.removeAt = function(position){     if(position > -1 && position < length){        var current = head,         index = 0,         previous;        if(position === 0){          current.next.previous = tail;         head = current.next;        }else if(position === length - 1){          current = tail;          current.prev.next = head;         head.prev = current.prev;         tail = current.prev;       }else{          while(index++ < position){           previous = current;           current = current.next;         }          previous.next = current.next;         current.next.prev = previous;        }        length--;       return true;     }else{       return false;     }   };    this.remove = function(element){     var current = head,       previous,       indexCheck = 0;      while(current && indexCheck < length){       if(current.element === element){         if(indexCheck === 0){           current.next.prev = tail;           head = current.next;         }else{           current.next.prev = previous;           previous.next = current.next;         }         length--;         return true;       }        previous = current;       current = current.next;       indexCheck++;     }      return false;   };    this.remove = function(){     if(length === 0){       return false;     }      var current = head,       previous,       indexCheck = 0;      if(length === 1){       head = null;       tail = null;       length--;       return current.element;     }      while(indexCheck++ < length){       previous = current;       current = current.next;     }      previous.next = head;     tail = previous.next;     length--;     return current.element;   };    this.indexOf = function(element){     var current = head,       index = 0;      while(current && index++ < length){       if(current.element === element){         return index;       }       current = current.next;     }      return false;   };    this.toString = function(){     var current = head,       indexCheck = 0,       string = '';      while(current && indexCheck < length){       string += current.element;       indexCheck++;       current = current.next;     }        return string;   };    this.isEmpty = function(){     return length === 0;   };    this.getHead = function(){     return head;   };    this.getTail = function(){     return tail;   };    this.size = function(){     return length;   }; } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

Javascript | es2016 import和requ

Javascript | es2016 import和requ

详解,区别,电脑软件,Javascript,require,本文介绍了Javascript(es2016) import和require用法和区别详解,分享给大家,具体如下:写个简单js文件,假设名字为:lib.js 。 假设内容如下:export const sqrt = Math.sqrt;export function square(x) { ret…

excel表格设置页码的教程

excel表格设置页码的教程

教程,设置,页码,表格,电脑软件,  Excel中的表格该如何设置页码呢?接下来是小编为大家带来的excel表格设置页码的教程,供大家参考。excel表格设置页码的教程:  设置页码步骤1:点击&ldquo;页面布局&rdquo;下&ldquo;页面设置&rdquo;中右下角…

Excel表格数据怎么使用内容重排的

Excel表格数据怎么使用内容重排的

重排,数据,表格,功能,内容,  在网站上搜索到要找的数据,却发现复制到excel中数据全部挤在一个单元格中。 这样也就无法对数据进行处理。如果解决数据挤在一行的问题!答案是用EXCEL内容重排功能!内容重排的功能就是将一个单元格的内容按照…

excel2007 保存工作区教程

excel2007 保存工作区教程

教程,工作区,电脑软件,  在Excel中往往不能在当天完成工作需要第二天继续完成,这个时候就要把工作簿保存为工作区了,想必有些朋友会不太懂,不过没关系,我们一起来学习一下如何保存工作区。下面是小编带来的关于excel2007 保存工作区教程,希望…

word如何从任意页开始编页码word从

word如何从任意页开始编页码word从

方法,步骤,设置,页码,电脑软件,  我们编辑Word时候经常需要从Word中的某一页开始编页码。比如说前面是封面和目录,后面的正文才可以编页码,如何实现呢?下面小编教你word如何从任意页开始编页码,希望对你有帮助!word从任意页开始编页码的方法…

最非主流的个性签名个性签名大全伤

最非主流的个性签名个性签名大全伤

推荐,个性签名,非主流,伤感,优秀,  最非主流的个性签名有哪些?非主流文化是相对于主流文化而言的;非主流文化一开始无论是在价值导向、接受程度上都与主流文化有很大的差异;然而非主流文化往往代表的是一种新生文化现象,在文化表现形式和…

怎么设置word自动索引目录设置word

怎么设置word自动索引目录设置word

索引,设置,方法,步骤,目录,  实际和论文的编写都可能会在word中插入目录,但是如何才能编辑出精美的文档目录呢?下面小编来告诉你吧。word自动索引目录的步骤打开需要进行目录编辑的文档。word自动索引目录的步骤图1  对标题格式进行设置…

excel2007 if 层数嵌套层数用法教

excel2007 if 层数嵌套层数用法教

教程,嵌套,层数,电脑软件,  在Excel中录入好数据以后经常需要统计数据,统计数据的过程中经常需要用到函数,其中IF函数较为常用,而IF函数的嵌套层数比较难用,如果需要用的朋友一起学习一下吧。下面是由小编分享的excel2007 if 层数嵌套层数用…

微信公众平台如何添加上传视频?

微信公众平台如何添加上传视频?

上传视频,微信公众平台,电脑软件,  微信平台怎么发送短视频,外部微视频链接怎么上传到微信呢!现在使用微信的朋友不仅止于图片和文字的阅读,如果使采用短视频来互动将会更直观的呈现出不一样的效果,下面小编就演示一次操作微信公众平台视频…

jQuery实现Select下拉列表进行状态

jQuery实现Select下拉列表进行状态

选择,下拉列表,状态,功能,电脑软件,场景:eg:在管理一篇博文时,因博文的管理有一列叫:状态的列,该列有诸多状态,如:正常,待审核,删除等... 此时,若使用Select下拉列表进行状态选择,并在选中具体项值后,通过Ajax异步提交,在效果及体验上就能得到更大化的…

Excel表格中复选框控件怎么使用

Excel表格中复选框控件怎么使用

控件,复选框,表格,使用方法,电脑软件,  &ldquo;复选框&rdquo;控件可用于打开或关闭某个选项,常用于在Excel工作表中同时进行多个选项的选择。以下是小编为您带来的关于Excel表格中复选框控件的使用方法,希望对您有所帮助。Excel表格中复选…

在微信朋友圈发语音的方法

在微信朋友圈发语音的方法

语音,方法,微信朋友圈,电脑软件,  随着微信相关接口的开放,开发者可利用 JS-SDK 音频类接口生成一个录音文件,并将其快速上传到云端服务器或从云端服务器将语音快速下载到网页。换言之,在不安装第三方应用的前提下,实现在朋友圈发布语音消息…