class LRUCache {
HashMap<Integer, Node> map;
int capacity;
int count;
Node head;
Node tail;
public LRUCache(int capacity) {
map = new HashMap<Integer, Node>();
this.capacity = capacity;
this.count = 0;
head = new Node();
tail = new Node();
head.next = tail;
tail.prior = head;
}
public void moveToHead(Node n){
n.next = head.next;
head.next.prior = n;
n.prior = head;
head.next = n;
}
public void removeNode(Node n){
n.next.prior = n.prior;
n.prior.next = n.next;
}
public int get(int key) {
Node n = map.get(key);
if(n == null)
return -1;
removeNode(n);
moveToHead(n);
return n.value;
}
public void put(int key, int value) {
if(map.containsKey(key)){
Node node = map.get(key);
node.value = value;
removeNode(node);
moveToHead(node);
}else{
Node nNode = new Node();
nNode.key = key;
nNode.value = value;
count++;
if(count > capacity){
map.remove(tail.prior.key);
tail.prior.prior.next = tail;
tail.prior = tail.prior.prior;
count--;
}
map.put(key, nNode);
moveToHead(nNode);
}
}
}
/**
* 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);
*/
class Node{
int key;
int value;
Node next;
Node prior;
}
【刷题】Leetcode 146. LRU Cache
最新推荐文章于 2022-07-19 00:43:37 发布