【哈希链表】LeetCode 146. LRU 缓存
题目链接
思路
使用Java中的 LinkedHashMap
类型,其数据结构示意图如下图所示。
因为该数据结构中最近添加的元素都在链表尾部,所以要让某个元素变为最近使用的状态,需要将它先删除,然后再插入。表头存储的就是最少使用的元素,使用 this.cache.keySet().iterator().next()
获得表头元素的 key
。
代码
class LRUCache{
LinkedHashMap<Integer, Integer> cache;
int capacity;
public LRUCache(int capacity){
this.cache = new LinkedHashMap<>(capacity);
this.capacity = capacity;
}
public int get(int key){
if(!this.cache.containsKey(key)){
return -1;
}
makeRecent(key);
return cache.get(key);
}
public void put(int key, int value){
if(this.cache.containsKey(key)){
makeRecent(key);
this.cache.put(key, value);
return;
}
if(this.cache.size() >= this.capacity){
// the odestKey exists in the list head
int oldestKey = this.cache.keySet().iterator().next();
this.cache.remove(oldestKey);
}
this.cache.put(key, value);
}
private void makeRecent(int key){
int val = this.cache.get(key);
this.cache.remove(key);
this.cache.put(key, val);
}
}