class LRUCache {
int cap;
int size;
Node head;
Node tail;
Map<Integer, Node> map = new HashMap<>();
public LRUCache(int capacity) {
cap = capacity;
size = 0;
head = new Node();
tail = new Node();
head.next = tail;
tail.pre = head;
}
public int get(int key) {
Node n = map.get(key);
if (n == null) return -1;
get(n);
insert(n);
return n.val;
}
public void put(int key, int value) {
if (cap == 0) return;
Node n = map.get(key);
if (n == null) {
if (cap == size) {
Node p = poll();
map.remove(p.key);
} else {
size++;
}
n = new Node();
}
n.key = key;
n.val = value;
map.put(key, n);
get(n);
insert(n);
}
public Node poll() {
if (size == 0) return null;
Node n = head.next;
Node next = n.next;
head.next = next;
next.pre = head;
return n;
}
public void get(Node n) {
Node pre = n.pre;
Node next = n.next;
if (pre != null) {
pre.next = next;
}
if (next != null) {
next.pre = pre;
}
}
public void insert(Node n) {
Node pre = tail.pre;
pre.next = n;
tail.pre = n;
n.pre = pre;
n.next = tail;
}
class Node {
int key;
int val;
Node pre;
Node next;
public String toString() {
return "[key:" + key + "; val:" + val + "; pre:" + pre + "; next:" + next + "]";
}
}
}