package com.interview.design.questions;
import java.util.HashMap;
import java.util.Map;
/**
* Created_By: stefanie
* Date: 14-12-4
* Time: 下午8:37
*/
public class DZ14_LRUCache {
class Node{
int key;
int value;
Node prev;
Node next;
public Node(int key, int value){
this.key = key;
this.value = value;
}
}
Node head = null;
Node tail = null;
int capacity = 0;
Map<Integer, Node> map;
public DZ14_LRUCache(int capacity) {
this.capacity = capacity;
map = new HashMap<Integer, Node>();
}
public int get(int key) {
Node node = getNode(key);
return node == null? -1 : node.value;
}
private Node getNode(int key){
Node node = map.get(key);
if(node == null) return null;
if(head == node) return node;
//remove node from the list
node.prev.next = node.next;
if(node.next != null) node.next.prev = node.prev;
else tail = node.prev;
//add node after head
head.prev = node;
node.next = head;
head = node;
node.prev = null;
return node;
}
public void set(int key, int value) {
Node node = getNode(key);
if(node != null){
node.value = value;
} else {
if(map.size() == capacity){
map.remove(tail.key);
tail = tail.prev;
if(tail != null) tail.next = null;
else head = null;
}
node = new Node(key, value);
map.put(key, node);
if(head != null) head.prev = node;
else tail = node;
node.next = head;
head = node;
}
}
}