解题思路:
这道题主要考察缓存机制。
要利用哈希链表。
靠近头部的数据是最久未使用的,靠近尾部的数据是最近使用的。
双链表一层存Key,与哈希表的Key做映射,另一层存Value。
双链表与哈希表都存Key的原因是,在双链表中要做删除操作,要操作删除节点的前驱指针,只有双链表也存key,才能保证时间复杂度为O(1)。
双链表中同时存Key 和 Value的意义是,当缓存容量满的时候,我们要删除双链表中最久未使用的Node, 此时也要把Map中映射到的Key也删除掉,这时只能通过Key的辅助来达到目的。
想一下,普通链表的删除,不能像数组一样通过索引的方式删除。
class LRUCache {
int capacity;
LinkedHashMap<Integer, Integer> cache = new LinkedHashMap<>();
//设定缓存容量
public LRUCache(int capacity) {
this.capacity = capacity;
}
//获取对应Key的值,并把其调整为最近使用
public int get(int key) {
if(!cache.containsKey(key)){
return -1;
}
makeRecently(key);
return cache.get(key);
}
//加入新的值
public void put(int key, int value) {
if(cache.containsKey(key)){
cache.put(key,value); //修改key的值
makeRecently(key); //将k变为最近使用
return;
}
if(cache.size() == this.capacity){
//链表表头是最久未使用的key
int oldKey = cache.keySet().iterator().next(); //双链表的keySet,获取表头,这里KeySet是有序的
cache.remove(oldKey);
}
cache.put(key,value);
}
//把一个key 变为最近使用的缓存
private void makeRecently(int key){
int val = cache.get(key);
cache.remove(key);
cache.put(key,val);
}
}
如果对你有帮助,可以关注下公众号。