日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript中的链表结构—双向链表

發(fā)布時間:2025/7/14 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript中的链表结构—双向链表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.概念

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

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

圖1

首先是要為Node類增加一個previouse屬性,這個屬性指向當(dāng)前節(jié)點的前驅(qū):

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

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

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()方法幣單項鏈表的效率更高,因為不需要查找前驅(qū)節(jié)點了。首選需要在鏈表中找出存儲待刪除數(shù)據(jù)的節(jié)點,然后設(shè)置該節(jié)點的next屬性,使其指向待刪除節(jié)點的后續(xù)。設(shè)置該節(jié)點的后續(xù)的previouse的屬性,使其指向待刪除節(jié)點的前驅(qū)。如下圖2展示刪除節(jié)點的過程:

圖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;} }

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

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.代碼實現(xiàn)

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

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();

?

作者:Tyler Ning
出處:http://www.cnblogs.com/tylerdonet/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,可以通過以下郵箱地址williamningdong@gmail.com ?聯(lián)系我,非常感謝。

總結(jié)

以上是生活随笔為你收集整理的javascript中的链表结构—双向链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。