class Node<K,V> {
Node pre;
Node next;
K k;
V v;
Node(K k,V v){
this.v=v;
}
}
class LRUCache<K,V> {
int size;
HashMap<K, Node> map = null;
Node head = null;
Node tail = null;
LRUCache(int size) {
this.size=size;
this.map=new HashMap<K,Node>();
}
public void set(K k,V v){
Node temp=map.getOrDefault(k,null);
if(temp!=null){
temp.v=v;
}else{
temp=new Node(k,v);
if(map.size()>=this.size) {
remove();
}
map.put(k, temp);
}
setHead(temp);
}
public V get(K k){
Node temp=map.getOrDefault(k,null);
if(temp!=null){
setHead(temp);
return (V)temp.v;
}
return null;
}
private void setHead(Node node){
if(node!=head){
if(node!=tail){
node.pre.next=node.next;
node.next.pre=node.pre;
node.next=head;
head.pre=node;
node.pre=null;
}else{
tail=node.pre;
tail.next=null;
node.pre=null;
node.next=head;
head.pre=node;
head=node;
}
}
}
public void remove(){
Node temp2 = this.tail.pre;
temp2.next = null;
this.tail.pre = null;
this.tail = temp2;
this.map.remove(tail.k);
}
}