實現原理: 將cache的所有位置都用雙連表連線起來,當乙個位置被命中之後,就將通過調整鍊錶的指向,將該位置調整到煉表頭的位置,新加入的cache直接加到煉表頭中。
這樣,在多次進行cache操作後,最近被命中的,就會被向煉表頭方向移動,而沒有命中的,而想鍊錶後面移動,鍊錶尾則表示最近最少使用的cache。
當需要替換內容時候,鍊錶的最後位置就是最少被命中的位置,我們只需要淘汰鍊錶最後的部分即可。
public class lrucache
} public lrucache(int i)
/*** 獲取快取中物件
* @param key
* @return
*/public object get(object key) else }
/*** 新增快取
* @param key
* @param value
*/public void put(object key, object value) else
node = new cachenode();
} node.value = value;
node.key = key;
//將最新使用的節點放到煉表頭,表示最新使用的.
movetohead(node);
nodes.put(key, node);
} /**
* 將快取刪除
* @param key
* @return
*/public object remove(object key)
if (node.next != null)
if (last == node)
last = node.prev;
if (first == node)
first = node.next;
} return node;
} public void clear()
/*** 刪除鍊錶尾部節點
* 表示 刪除最少使用的快取物件
*/private void removelast() }
/*** 移動到煉表頭,表示這個節點是最新使用過的
* @param node
*/private void movetohead(cachenode node)
first = node;
node.prev = null;
if (last == null)
last = first;
} private int cachesize;
private hashtable nodes;//快取容器
private int currentsize;
private cachenode first;//煉表頭
private cachenode last;//鍊錶尾
}
單鏈表 雙鏈表
實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的...
單鏈表和雙鏈表
單鏈表 單鏈表只有乙個指向下一結點的指標,也就是只能next 雙鏈表 雙鏈表除了有乙個指向下一結點的指標外,還有乙個指向前一結點的指標,可以通過prev 快速找到前一結點,顧名思義,單鏈表只能單向讀取 為什麼市場上單鏈表的使用多餘雙鏈表呢?從儲存結構來看,每個雙鏈表的節點要比單鏈表的節點多乙個指標,...
單鏈表和雙鏈表
單鏈表 是乙個node,儲存當前物件,並指向下乙個next,插入在第一位node,next指向原來的first 單鏈表 只儲存第乙個node的引用,雙端鍊錶 儲存兩個node的引用,第乙個和最後乙個node,可以從第乙個插入,也可以從最後乙個插入,也可以從頭部和尾部刪除 鏈結點,相當於是車廂 pub...