146. LRU缓存机制
链接
题目描述
思路
基于 HashMap 和 双向链表实现
代码
class LRUCache {
private int count;
private int capacity;
private HashMap<Integer,LinkedNode> cache = new HashMap<>();
private LinkedNode head,tail;
public LRUCache(int capacity) {
this.count = 0;
this.capacity = capacity;
head = new LinkedNode();
tail = new LinkedNode();
head.post = tail;
tail.pre = head;
}
public int get(int key) {
LinkedNode node = cache.get(key);
if(node == null){
return -1;
}
this.moveToHead(node);
return node.value;
}
public void put(int key, int value) {
LinkedNode node = cache.get(key);
if(node == null){
node = new LinkedNode();
node.key = key;
node.value = value;
this.cache.put(key,node);
this.addNode(node);
count++;
if(count > capacity){
LinkedNode pop = this.removeTail();
this.cache.remove(pop.key);
--count;
}
}else{//如果已经存在于cache中
node.value = value;
this.moveToHead(node);
}
}
private LinkedNode removeTail(){
LinkedNode pop = tail.pre;
LinkedNode pre = tail.pre.pre;
pre.post = tail;
tail.pre = pre;
return pop;
}
private void moveToHead(LinkedNode node){
this.removeNode(node);
this.addNode(node);
}
private void removeNode(LinkedNode node){
LinkedNode pre = node.pre;
LinkedNode post = node.post;
pre.post = post;
post.pre = pre;
}
private void addNode(LinkedNode node){
LinkedNode post = head.post;
post.pre = node;
head.post = node;
node.pre = head;
node.post = post;
}
public class LinkedNode{
int key;
int value;
LinkedNode pre;
LinkedNode post;
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/