package com.interview.algorithms.list;
import java.util.HashMap;
import java.util.Map;
/**
* Created_By: stefanie
* Date: 14-6-29
* Time: 下午10:43
*/
public class C3_6_LRUCacheList<Key, Value> {
class Node<Key, Value>{
Key key;
Value value;
Node next;
Node prev;
public Node(Key key, Value value){
this.key = key;
this.value = value;
}
}
private int N = 10;
private Map<Key, Node<Key, Value>> map = new HashMap<Key, Node<Key, Value>>();
private Node<Key, Value> head;
private Node<Key, Value> tail;
public C3_6_LRUCacheList(){
}
public C3_6_LRUCacheList(int N){
this.N = N;
}
public void set(Key key, Value value){
Node<Key, Value> node = map.get(key);
if(node != null){
node.value = value;
visit(node);
} else {
if(map.size() == N){
//need delete the tail element
map.remove(tail.key);
tail.prev.next = null;
tail = tail.prev;
}
//insert the new element
Node<Key, Value> newNode = new Node<Key, Value>(key, value);
newNode.next = head;
if(head != null) head.prev = newNode;
head = newNode;
if(tail == null) tail = newNode;
map.put(key, newNode);
}
}
public Value get(Key key){
Node<Key, Value> node = map.get(key);
if(node != null){
if(node != head) {
visit(node);
}
return node.value;
} else {
return null;
}
}
private void visit(Node<Key, Value> node){
//delete visited node in the list
node.prev.next = node.next;
if (node == tail) tail = node.prev;
else node.next.prev = node.prev;
//add the visited node as the header
node.next = head;
head.prev = node;
node.prev = null;
head = node;
}
public int size(){
return map.size();
}
}