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 }
View Code

if(first!=null){
e.next = first;
first.before = e;

if(curSize==1)

posted @ 2014-02-22 16:20  krunning  阅读(155)  评论(0编辑  收藏  举报