鏈表有單向鏈表、雙向鏈表和循環鏈表,此篇文章只講解單向鏈表,另外兩種會在下一篇文章中補充,要真正理解和使用鏈表的話,建議三種鏈表結構都了解一下。
平時我們使用最多的數據結構應該是數組,很多東西都可以用數組來輕松實現,但在某些編程語言中,數組的長度是預先設定好的,想要額外添加元素或者刪除元素是一件比較困難的事。那么使用鏈表的話恰恰就解決了這些問題,對於鏈表來說刪除或添加一個元素是非常方便的,除了數據的隨機訪問(可以實現但是比較麻煩,比如可以通過添加和操作索引值來實現),它幾乎可以用在任何可以使用一維數組的情況中。
鏈表的定義
鏈表是由一組節點組成的集合。每個節點都使用一個對象的引用指向它的后繼。指向另一
個節點的引用叫做鏈。
一般的鏈表都會額外添加一個頭節點(作為輔助)和尾節點,例如下面這種樣子
數組元素靠它們的位置進行引用,鏈表元素則是靠相互之間的關系進行引用。在上圖中,我們說 bread 跟在 milk 后面,而不說 bread 是鏈表中的第二個元素。遍歷鏈表,就是跟着鏈接,從鏈表的首元素一直走到尾元(但這不包含鏈表的頭節點,頭節點常常用來作為鏈表的接入點)。上圖中另外一個值得注意的地方是,鏈表的尾元素指向一個 null 節點。
插入新元素:
向單向鏈表中插入一個節點,只需要修改它前面的節點(前驅),使其指向新加入的節點,而新加入的節點則指向原來前驅指向的節點。上圖演示了如何在 eggs 后加入 cookies。
刪除鏈表中已有元素:
從鏈表中刪除一個元素也很簡單。只需要將待刪除元素的前驅節點指向待刪除元素的后繼節點。上圖展示了從單向鏈表中刪除Bacon。
除了插入和刪除,鏈表還有其他一些操作,后面將給出講解。
設計一個基於對象的鏈表
我們需要設計兩個類,Node 類用來表示節點, LinkedList 類提供插入節點、刪除節點、顯示列表元素的方法,以及其他一些輔助方法。