双向链表加map
public class LRUCache {
class LinkNode{
int key;
int val;
LinkNode pre;
LinkNode next;
public LinkNode(){}
public LinkNode(int key,int val){
this.key = key;
this.val = val;
}
}
private Map<Integer, LinkNode> mp = new HashMap<Integer, LinkNode>();
private int capacity;
private LinkNode head,tail;
private int size;
public LRUCache(int capacity) {
this.capacity = capacity;
this.size = 0;
head = new LinkNode();
tail = new LinkNode();
head.next = tail;
tail.next = head;
}
public int get(int key) {
if(mp.get(key) == null) return -1;
else{
LinkNode lk = mp.get(key);
moveToHead(lk);
return lk.val;
}
}
public void put(int key, int value) {
if(mp.get(key) == null){
LinkNode lk = new LinkNode(key, value);
mp.put(key, lk);
addToHead(lk);
size++;
if(size > capacity){
LinkNode res = tail.pre;
removeNode(res);
mp.remove(res.key);
size--;
}
}
else{
LinkNode lk = mp.get(key);
lk.val = value;
moveToHead(lk);
}
}
private void removeNode(LinkNode lk){
lk.pre.next = lk.next;
lk.next.pre = lk.pre;
}
private void addToHead(LinkNode lk){
lk.pre = head;
lk.next = head.next;
head.next.pre = lk;
head.next = lk;
}
private void moveToHead(LinkNode lk){
removeNode(lk);
addToHead(lk);
}
}
/**
* 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);
*/ 
京公网安备 11010502036488号