js實現雙向鏈表

來源:互聯網
上載者:User

標籤:ret   item   document   png   move   src   previous   問題   文章   

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 + ‘&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();

 

js實現雙向鏈表

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.