數據結構-鏈表

鏈表

單鏈表

  • 結構:-->data|next-->data|next-->null
  • 你應該能夠發現,其中有兩個結點是比較特殊的,它們分別是第一個結點和最後一個結點。咱們習慣性地把第一個結點叫做頭結點,把最 後一個結點叫做尾結點。其中,頭結點用來記錄鏈表的基地址。有了它,咱們就能夠遍歷獲得整條鏈表。而尾結點特殊的地方是:指針不是指向下一個結點,而 是指向一個空地址NULL,表示這是鏈表上最後一個結點

循環鏈表

  • 循環鏈表的尾節點指針是指向鏈表的頭結點。
  • image.png

循環鏈表的優勢是從鏈尾到鏈頭比較方便。當要處理的數據具備環型結構特色時,就特別適合採用循環鏈表。好比著名的約瑟夫問題。儘管用單 鏈表也能夠實現,可是用循環鏈表實現的話,代碼就會簡潔不少算法

雙向鏈表

  • 須要額外的兩個空間來存儲後繼及誒單和前驅節點的地址,比單鏈佔用更多內存,但能夠支持雙向遍歷
  • image.png
  • 對於刪除節點中"值等於某個給定值"的結點,兩種方式都差很少
  • 對於刪除給定指針指向的結點,因爲雙向鏈表記錄了前驅結點的指針,不須要像單鏈表同樣遍歷
  • 查詢效率也比通常的鏈表快,平均只須要查找一半的數據
  • JAVA中的LinkedHashMap

雙向循環鏈表

  • image.png

基於鏈表實現LRU緩存淘汰算法

  • 維護一格有序單鏈表,越靠近尾部數據越早。當有一個新的數據被訪問時,咱們從鏈表頭開始順序遍歷鏈表。數組

  • 1.若是此數據以前已經被緩存在鏈表中了,咱們遍歷獲得這個數據對應的結點,並將其從原來的位置刪除,而後再插入到鏈表的頭部。緩存

  • 2.若是此數據沒有在緩存鏈表中,又能夠分爲兩種狀況:優化

若是此時緩存未滿,則將此結點直接插入到鏈表的頭部;    若是此時緩存已滿,則鏈表尾結點刪除,將新的數據結點插入鏈表的頭部。指針

  • 優化:引入散列表來記錄每一個數據的位置。

基於數組實現LRU緩存淘汰策略

  • 方式一:首位置保存最新訪問數據,末尾位置優先清理
  • 方式二:首位置優先清理,末尾位置保存最新訪問數據(優化:清理的時候能夠考慮一次性清理必定數量,減小清理次數)
相關文章
相關標籤/搜索