(三)鏈表簡介

一、鏈表不須要一塊連續的內存空間,它經過指針將一組零散的內存塊串聯起來使用。算法

 

二、常見的鏈表結構:單鏈表雙向鏈表循環鏈表數組

 

三、鏈表由指針結點兩部分組成,第一個結點叫頭結點,最後一個結點叫尾結點。頭結點用來記錄鏈表的基地址單鏈表的尾節點指向一個空地址NULL緩存

 

四、循環鏈表是一種特殊的單鏈表,它跟單鏈表惟一的區別就在尾結點,循環鏈表的尾結點指向鏈表的頭結點。循環鏈表的應用:約瑟夫問題數據結構

 

五、雙向鏈表支持兩個方向,每一個節點有一個後繼指針和一個前驅指針。雙向鏈表比單鏈表佔用的內存空間大,可是在作插入和刪除時的效率要比單鏈表高,這就是用空間換時間的設計思想。LinkedHashMap採用到了雙向鏈表的數據結構。spa

 

六、循環鏈表和雙向鏈表整合在一塊兒就是:雙向循環鏈表設計

 

七、數組和鏈表的比較:指針

(1)數組隨機訪問的效率更高,而鏈表插入刪除的效率更高。內存

(2)數組的缺點是大小固定,而鏈表自己沒有大小限制,自然支持動態擴容效率

(3)鏈表的缺點是比較消耗內存,Java中頻繁對鏈表插入和刪除有可能致使頻繁的GC。變量

 

八、鏈表的一個經典使用場景:實現LRU緩存淘汰算法。常見的緩存淘汰策略有:先進先出FIFO、最少使用策略LFU、最近最少使用策略LRU。

 

九、鏈表代碼編寫技巧:

(1)理解指針或引用的含義:將某個變量賦值給指針,實際上就是將這個變量的地址賦值給指針。

(2)警戒指針丟失和內存泄漏。

(3)利用哨兵法簡化實現難度:不帶頭鏈表的插入、刪除操做須要對插入第一個結點刪除最後一個結點特殊處理。

(4)重點留意邊界條件處理:鏈表爲、鏈表只有一個結點、鏈表只有兩個結點、處理頭結點和尾結點的時候。

(5)舉例畫圖、輔助思考。

(6)多寫多練。

 

十、鏈表常見操做(LeetCode對應編號206,141,21,19,876,解題思路可參考快慢指針算法):

(1)單鏈表反轉

(2)鏈表中環的檢測

(3)兩個有序的鏈表合併

(4)刪除鏈表倒數第n個結點

(5)求鏈表的中間結點

相關文章
相關標籤/搜索