<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      javascript中的鏈表結構—雙向鏈表

      1.概念

        上一個文章里我們已經了解到鏈表結構,鏈表的特點是長度不固定,不用擔心插入新元素的時候新增位置的問題。插入一個元素的時候,只要找到插入點就可以了,不需要整體移動整個結構。

        這里我們了解一下雙向鏈表的結構。盡管從鏈表中頭節點遍歷到尾節點很容易,但是反過來,從后向前遍歷就沒有那么簡單。通過給Node對象增加一個屬性,該屬性存儲指向前驅節點的鏈接,這樣就容易多了。此時祥鏈表中插入一個節點需要更多的工作,我們需要指出該節點正確的前驅和后續。但是在從鏈表中刪除節點的時候效率更高了,不需要再查找待刪除節點的前驅節點了。如下圖1演示了雙向鏈表的工作原理。

      圖1

      首先是要為Node類增加一個previouse屬性,這個屬性指向當前節點的前驅:

      function Node(element){
          this.element = element;
          this.next = null;
          this.previous = null;
      }

        雙向鏈表的insert()方法和單項鏈表的類似,但是需要設置新節點的previouse屬性,是其指向該節點的前驅。該方法的定義如下:

      function insert(newElement , item){
          var newNode = new Node(newElement);
          var current = this.find(item);
          newNode.next = current.next;
          newNode.previous = current;
          current.next = newNode;
      }

        雙向鏈表的刪除remove()方法幣單項鏈表的效率更高,因為不需要查找前驅節點了。首選需要在鏈表中找出存儲待刪除數據的節點,然后設置該節點的next屬性,使其指向待刪除節點的后續。設置該節點的后續的previouse的屬性,使其指向待刪除節點的前驅。如下圖2展示刪除節點的過程:

      圖2

      remove()方法的定義如下:

      function remove(item){
          var currNode = this.find(item);
          if(!(currNode.next == null)){
              currNode.previous.next = currNode.next;
              currNode.next.previous = currNode.previous;
              currNode.next = null;
              currNode.previous = null;
          }
      }

        為了實現反向顯示鏈表中元素的任務,需要給鏈表增加一個工具方法,用來查找鏈表中最后一個節點。findLast()方法找出鏈表中最后一個節點,同時免除從前往后遍歷之苦。如下:

      function findLast(){
          var currNode = this.head;
          while (!(currNode.next == null)){
              currNode = currNode.next;
          }
          return currNode;
      }

        有了這個工具方法之后就,就可以很容易的寫出反向顯示雙向鏈表的元素的方法,dispReverse()方法如下所示:

      function dispReverse(){
          var currNode = this.head;
          currNode = this.findLast();
          while (!(currNode.previous == null)){
              document.write(currNode.element + '&nbsp;');
              currNode = currNode.previous;
          }
      }

       

      2.代碼實現

        雙向鏈表就上面一些特性,下面是完整的代碼實現和測試代碼:

      function Node(element){
          this.element = element;
          this.next = null;
          this.previous = null;
      }
      
      function LList(){
          this.head = new Node('head');
          this.find = find;
          this.insert = insert;
          this.display = display;
          this.remove = remove;
          this.findLast = findLast;
          this.dispReverse = dispReverse;
      }
      
      function dispReverse(){
          var currNode = this.head;
          currNode = this.findLast();
          while (!(currNode.previous == null)){
              document.write(currNode.element + '&nbsp;');
              currNode = currNode.previous;
          }
      }
      
      function findLast(){
          var currNode = this.head;
          while (!(currNode.next == null)){
              currNode = currNode.next;
          }
          return currNode;
      }
      
      function remove(item){
          var currNode = this.find(item);
          if(!(currNode.next == null)){
              currNode.previous.next = currNode.next;
              currNode.next.previous = currNode.previous;
              currNode.next = null;
              currNode.previous = null;
          }
      }
      
      function display(){
          var currNode = this.head;
          while (!(currNode.next == null)){
              document.write(currNode.next.element + '&nbsp;');
              currNode = currNode.next;
          }
      }
      
      function find(item){
          var currNode = this.head;
          while (currNode.element != item){
              currNode = currNode.next;
          }
          return currNode;
      }
      
      function insert(newElement , item){
          var newNode = new Node(newElement);
          var current = this.find(item);
          newNode.next = current.next;
          newNode.previous = current;
          current.next = newNode;
      }
      
      
      var cities = new LList();
      cities.insert('Conway','head');
      cities.insert('Russellville', 'Conway');
      cities.insert('Carlisle', 'Russellville');
      cities.insert('Alma' , 'Carlisle');
      cities.display();
      document.write('<br>');
      cities.remove('Carlisle');
      cities.display();
      document.write('<br>');
      cities.dispReverse();

       

      posted @ 2016-09-21 23:58  nd  閱讀(3947)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日本一道高清一区二区三区| 亚洲男人天堂一级黄色片| 国产美女深夜福利在线一| 日韩成人无码影院| 天干天干夜啦天干天干国产| 亚洲色成人一区二区三区人人澡人人妻人人爽人人蜜桃麻豆 | 精品国产中文字幕av| 乌克兰美女浓毛bbw| 国产自拍一区二区三区在线| 国产精品中文字幕综合| 蜜臀在线播放一区在线播放| 老少配老妇老熟女中文普通话| 亚洲熟妇丰满多毛xxxx| 鲁丝片一区二区三区免费| 亚洲女同精品久久女同| 一本大道卡一卡二卡三乱码全集资源| 亚洲精品区二区三区蜜桃| 凤阳县| 激情国产一区二区三区四| 国产成人免费午夜在线观看| 亚洲国产日韩一区三区| 成人免费无码av| 国产又色又爽又黄的视频在线| 色吊丝一区二区中文字幕| 影音先锋人妻啪啪av资源网站| 自拍视频亚洲精品在线| 亚洲熟妇自偷自拍另类| 亚洲一区成人av在线| 国产一区二区视频在线看| 九九综合va免费看| 狠狠综合久久av一区二| 桑日县| 国产一区日韩二区三区| 人妻无码中文字幕| 亚洲AV成人无码精品电影在线| 亚洲精品自产拍在线观看动漫| 精品黄色av一区二区三区| 日韩欧美国产aⅴ另类| 久热综合在线亚洲精品| 亚洲成女人图区一区二区| 国产在线拍偷自揄观看视频网站 |