鏈表
單鏈表
- 結構:-->data|next-->data|next-->null
- 你應該能夠發現,其中有兩個結點是比較特殊的,它們分別是第一個結點和最後一個結點。咱們習慣性地把第一個結點叫做頭結點,把最 後一個結點叫做尾結點。其中,頭結點用來記錄鏈表的基地址。有了它,咱們就能夠遍歷獲得整條鏈表。而尾結點特殊的地方是:指針不是指向下一個結點,而 是指向一個空地址NULL,表示這是鏈表上最後一個結點
循環鏈表
- 循環鏈表的尾節點指針是指向鏈表的頭結點。
-
循環鏈表的優勢是從鏈尾到鏈頭比較方便。當要處理的數據具備環型結構特色時,就特別適合採用循環鏈表。好比著名的約瑟夫問題。儘管用單 鏈表也能夠實現,可是用循環鏈表實現的話,代碼就會簡潔不少算法
雙向鏈表
- 須要額外的兩個空間來存儲後繼及誒單和前驅節點的地址,比單鏈佔用更多內存,但能夠支持雙向遍歷
-
- 對於刪除節點中"值等於某個給定值"的結點,兩種方式都差很少
- 對於刪除給定指針指向的結點,因爲雙向鏈表記錄了前驅結點的指針,不須要像單鏈表同樣遍歷
- 查詢效率也比通常的鏈表快,平均只須要查找一半的數據
- JAVA中的LinkedHashMap
雙向循環鏈表
基於鏈表實現LRU緩存淘汰算法
-
維護一格有序單鏈表,越靠近尾部數據越早。當有一個新的數據被訪問時,咱們從鏈表頭開始順序遍歷鏈表。數組
-
1.若是此數據以前已經被緩存在鏈表中了,咱們遍歷獲得這個數據對應的結點,並將其從原來的位置刪除,而後再插入到鏈表的頭部。緩存
-
2.若是此數據沒有在緩存鏈表中,又能夠分爲兩種狀況:優化
若是此時緩存未滿,則將此結點直接插入到鏈表的頭部; 若是此時緩存已滿,則鏈表尾結點刪除,將新的數據結點插入鏈表的頭部。指針
基於數組實現LRU緩存淘汰策略
- 方式一:首位置保存最新訪問數據,末尾位置優先清理
- 方式二:首位置優先清理,末尾位置保存最新訪問數據(優化:清理的時候能夠考慮一次性清理必定數量,減小清理次數)