import java.util.*;
public class LruTest {
public static void main(int[] args) {
}
}
class Node{
Node pre;
Node next;
int key;
int value;
Node(){
pre = next = null;
key = -1;
value =-1;
}
Node(int key,int value){
this.value = value;
this.key = key;
}
}
class LRUCache{
Node head;
Node tail;
int capity ;
Map<Integer,Node> map = new HashMap();
LRUCache(int capity) {
head = new Node();
tail = new Node();
head.next = tail;
tail.pre = head;
this.capity = capity;
}
int get(int key){
int value;
if(! map.containsKey(key)) return -1;
else {
value = map.get(key).value;
remove(key);
add(key,value);
}
return value;
}
boolean put(int key,int value) {
if (map.containsKey(key)) {
remove(key);
add(key,value);
return true;
}
add(key,value);
if(map.size() > capity){
remove(tail.pre.key);
}
return true;
}
void add(int key,int value){
Node node = new Node(key,value);
head.next.pre = node;
node.next = head.next;
node.pre = head;
head.next = node;
map.put(key,node);
}
void remove(int key){
Node node = map.get(key);
node.pre.next = node.next;
node.next.pre = node.pre;
node.next = null;
node.pre = null;
map.remove(key);
}
}
class LRUCache1{
int capity;
LinkedHashMap<Integer,Integer> linkedHashMap = new LinkedHashMap();
LRUCache1(int capity) {
this.capity = capity;
}
int get(int key){
if(!linkedHashMap.containsKey(key)) return -1;
int value = linkedHashMap.get(key);
remove(key);
add(key,value);
return value;
}
void put(int key, int value){
if(linkedHashMap.containsKey(key)){
remove(key);
add(key,value);
}
else{
add(key,value);
}
if(linkedHashMap.size() > capity) linkedHashMap.remove(linkedHashMap.entrySet().iterator().next().getKey());
}
void add(int key, int value){
linkedHashMap.put(key,value);
}
void remove(int key){
linkedHashMap.remove(key);
}
}