LRU Cache
1 public class LRUCache {
2 HashMap<Integer,entry> ht;
3 int curSize;
4 int size;
5 entry first=null;
6 entry last=null;
7 public LRUCache(int capacity) {
8 size = capacity;
9 ht = new HashMap<Integer,entry>();
10 curSize = 0;
11 }
12
13 public int get(int key) {
14 if(ht.get(key)!=null){
15 moveToHead(ht.get(key));
16 return ht.get(key).value;
17 }
18 else return -1;
19 }
20
21 public void set(int key, int value) {
22 if(ht.get(key)!=null){
23 ht.get(key).value = value;
24 moveToHead(ht.get(key));
25 ht.put(key,ht.get(key));
26 }
27 else{
28 if(curSize>=size){
29 ht.remove(last.key);
30 removeTail();
31 }
32 else{curSize++;}
33 entry e = new entry(key,value);
34 ht.put(key,e);
35 moveToHead(e);
36 if(curSize==1){
37 first = e;
38 last = e;
39 }
40 }
41 }
42 public void removeTail(){
43 if(first==last){
44 first = null;
45 last = null;
46 }
47 else{
48 last.before.next = null;
49 last = last.before;
50 }
51
52 }
53 public void moveToHead(entry e){
54 if(first==e) return;
55 if(e.next!=null)
56 e.next.before = e.before;
57 if(e.before!=null)
58 e.before.next = e.next;
59 if(e==last)
60 last = e.before;
61 if(first!=null){
62 e.next = first;
63 first.before = e;
64 }
65 first = e;
66 e.before = null;
67 }
68 }
69 class entry{
70 int key,value;
71 entry before,next;
72 public entry(int key,int value){
73 this.key = key;
74 this.value = value;
75 }
76 }
if(first!=null){
e.next = first;
first.before = e;
if(curSize==1)