一、鏈表不須要一塊連續的內存空間,它經過指針將一組零散的內存塊串聯起來使用。算法
二、常見的鏈表結構:單鏈表、雙向鏈表和循環鏈表。數組
三、鏈表由指針和結點兩部分組成,第一個結點叫頭結點,最後一個結點叫尾結點。頭結點用來記錄鏈表的基地址,單鏈表的尾節點指向一個空地址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)求鏈表的中間結點