国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript數(shù)據(jù)結(jié)構(gòu)之雙向鏈表和雙向循環(huán)鏈表的實(shí)現(xiàn)

2024-05-06 15:24:00
字體:
供稿:網(wǎng)友

雙向鏈表和普通鏈表的區(qū)別在于,在鏈表中,一個節(jié)點(diǎn)只有鏈向下一個節(jié)點(diǎn)的鏈接,而在雙向鏈表中,鏈接是雙向的:一個鏈向下一個元素,另一個鏈向前一個元素。

雙向鏈表提供了兩種迭代列表的方法:從頭到尾,或者反過來。我們也可以訪問一個特定節(jié)點(diǎn)的下一個或前一個元素。在單向鏈表中,如果迭代列表時錯過了要找的元素,就需要回到列表起點(diǎn),重新開始迭代。這是雙向鏈表的一個優(yōu)點(diǎn)。

雙向鏈表:單向鏈表只能向著一個方向遍歷鏈表節(jié)點(diǎn),而在節(jié)點(diǎn)指針域中增加了前向指針的雙向鏈表,則可以向著兩個方向遍歷節(jié)點(diǎn)。這使得雙向鏈表也可以在任何一個節(jié)點(diǎn)遍歷整個鏈表。

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;   }; }             
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 鄂托克旗| 河津市| 进贤县| 眉山市| 富宁县| 临潭县| 保定市| 伊通| 永兴县| 洛川县| 淮安市| 吴旗县| 城口县| 登封市| 曲水县| 偃师市| 海淀区| 漳州市| 通江县| 岗巴县| 博野县| 黄大仙区| 那坡县| 前郭尔| 安陆市| 雷波县| 台山市| 罗定市| 磐石市| 什邡市| 抚松县| 西畴县| 晋州市| 马山县| 曲阜市| 巴林左旗| 会昌县| 稻城县| 渭南市| 永平县| 安康市|