讀古今文學網 > 學習JavaScript數據結構與算法(第2版) > 5.1 鏈表數據結構 >

5.1 鏈表數據結構

要存儲多個元素,數組(或列表)可能是最常用的數據結構。正如本書之前提到過的,每種語言都實現了數組。這種數據結構非常方便,提供了一個便利的語法來訪問它的元素。然而,這種數據結構有一個缺點:(在大多數語言中)數組的大小是固定的,從數組的起點或中間插入或移除項的成本很高,因為需要移動元素(儘管我們已經學過的JavaScript的array類方法可以幫我們做這些事,但背後的情況同樣是這樣)。

鏈表存儲有序的元素集合,但不同於數組,鏈表中的元素在內存中並不是連續放置的。每個元素由一個存儲元素本身的節點和一個指向下一個元素的引用(也稱指針或鏈接)組成。下圖展示了一個鏈表的結構:

相對於傳統的數組,鏈表的一個好處在於,添加或移除元素的時候不需要移動其他元素。然而,鏈表需要使用指針,因此實現鏈表時需要額外注意。數組的另一個細節是可以直接訪問任何位置的任何元素,而要想訪問鏈表中間的一個元素,需要從起點(表頭)開始迭代列表直到找到所需的元素。

現實中也有一些鏈表的例子。第一個例子就是康加舞隊。每個人是一個元素,手就是鏈向下一個人的指針。可以向隊列中增加人——只需要找到想加入的點,斷開連接,插入一個人,再重新連接起來。

另一個例子是尋寶遊戲。你有一條線索,這條線索是指向尋找下一條線索的地點的指針。你順著這條鏈接去下一個地點,得到另一條指向再下一處的線索。得到列表中間的線索的唯一辦法,就是從起點(第一條線索)順著列表尋找。

還有一個可能是用來說明鏈表的最流行的例子,那就是火車。一列火車是由一系列車廂(也稱車皮)組成的。每節車廂或車皮都相互連接。你很容易分離一節車皮,改變它的位置,添加或移除它。下圖演示了一列火車。每節車皮都是列表的元素,車皮間的連接就是指針:

在這一章,我們會介紹鏈表和雙向鏈表。但還是先從最簡單的數據結構開始吧。