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 + ` `); 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 + ` `); 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 + ` `); 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();
作者:Tyler Ning
出處:http://www.cnblogs.com/tylerdonet/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,如有問題,可以通過以下郵箱地址williamningdong@gmail.com
聯絡我,非常感謝。
相關文章
- 連結串列-雙向連結串列
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 雙向連結串列
- 資料結構——雙向連結串列資料結構
- 資料結構:雙向連結串列資料結構
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 資料結構之雙向連結串列資料結構
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 畫江湖之資料結構【第一話:連結串列】雙向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 雙向連結串列資料結構
- DoublyLinkedList(雙向連結串列)——Javascript版JavaScript
- 資料結構(雙向連結串列的實現)資料結構
- 實現雙向連結串列
- Linux 核心資料結構:雙向連結串列Linux資料結構
- JavaScript資料結構--連結串列JavaScript資料結構
- Go實現雙向連結串列Go
- java實現雙向連結串列Java
- C語言之雙向連結串列C語言
- 資料結構-雙向連結串列(Python實現)資料結構Python
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- Java雙向連結串列的實現Java
- JAVA基礎:語言中連結串列和雙向連結串列的實現(轉)Java
- 畫江湖之資料結構【第一話:連結串列】單向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 單向連結串列資料結構
- JavaScript資料結構 之 連結串列JavaScript資料結構
- 連結串列-迴圈連結串列
- 資料結構學習(C++)——雙向連結串列 (轉)資料結構C++
- 雙向連結串列 尾節點插入
- python 資料結構之雙向連結串列的實現Python資料結構
- 反轉連結串列、合併連結串列、樹的子結構
- 雙向連結串列的建立及基本操作
- 雙向連結串列的功能實現(初版
- MYSQL INNODB 中通用雙向連結串列的實現MySql
- 資料結構_連結串列_單向迴圈連結串列 & 雙向連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 資料結構-單連結串列、雙連結串列資料結構
- (連結串列)連結串列的排序問題排序