class DLinkedNode { int key; int value; DLinkedNode pre; DLinkedNode post; }
/** * Always add the new node right after head; */ private void addNode(DLinkedNode node) { node.pre = head; node.post = head.post;
head.post.pre = node; head.post = node; }
/** * Remove an existing node from the linked list. */ private void removeNode(DLinkedNode node){ DLinkedNode pre = node.pre; DLinkedNode post = node.post;
pre.post = post; post.pre = pre; }
/** * Move certain node in between to the head. */ private void moveToHead(DLinkedNode node){ this.removeNode(node); this.addNode(node); }
// pop the current tail. private DLinkedNode popTail(){ DLinkedNode res = tail.pre; this.removeNode(res); return res; }
private Hashtable<Integer, DLinkedNode> cache = new Hashtable<Integer, DLinkedNode>(); private int count; private int capacity; private DLinkedNode head, tail;
public LRUCache(int capacity) { this.count = 0; this.capacity = capacity;