class LRUCache {
private int capacity;
HashMap<Integer, Node> map;
Node dummy = new Node(-1, -1);
public LRUCache(int capacity) {
this.capacity = capacity;
dummy.next = dummy;
dummy.pre = dummy;
map = new HashMap<Integer, Node>();
}
public int get(int key) {
if (!map.containsKey(key))
return -1;
// node放在最前面
Node node = remove(map.get(key));
addFirst(node);
return node.val;
}
public void put(int key, int value) {
Node node = new Node(key, value);
if (!map.containsKey(key)) {
if (map.size() >= capacity) {
Node pre = dummy.pre;
map.remove(pre.key);
remove(pre);
}
map.put(key, node);
addFirst(node);
} else {
Node node1 = map.get(key);
node1.val = value;
remove(node1);
addFirst(node1);
}
return;
}
public void addFirst(Node node) {
node.pre = this.dummy;
dummy.next.pre = node;
node.next = dummy.next;
dummy.next = node;
}
public Node remove(Node node) {
node.pre.next = node.next;
node.next.pre = node.pre;
return node;
}
class Node {
int key;
int val;
Node pre;
Node next;
public Node(int key, int val) {
this.key = key;
this.val = val;
}
}
}
/**
* 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);
*/
用map保存key和node,并维护一个node双向链表