一道很好的题目。也是从这俩天开始,对于面试的准备加入了Java 语言基础这一部分。 而这个题目,是一个很好的特殊功能多class的设计实现题
代码主要思路参考code ganker的代码,其中做了一些小的改动未来更好理解。
//这个题目,重点体会大是LRUCache这个class的设计思想。
public class LRUCache {
class node{
node prev,nxt;
int key;
int val;
public node(int key , int val){
this.key = key;
this.val = val;
}
}
private node first,last;
private int capacity;
private int num;
private HashMap map;
public LRUCache(int capacity) {
this.capacity = capacity;
num = 0;
map = new HashMap();
first = null;
last = null;
}
public int get(int key) {
node n = map.get(key);
if(n==null)
return -1;
else{
if(n != last){
if(n==first){
first = first.nxt;
first.prev = null;
}else{
n.nxt.prev = n.prev;
n.prev.nxt = n.nxt;
}
last.nxt = n;
n.prev = last;
n.nxt = null;
last = n;
}
return n.val;
}
}
public void set(int key, int value) {
node n = map.get(key);
if(n==null){
node newNode = new node(key, value);
map.put(key,newNode);
if(num>=capacity){
map.remove(first.key);
first = first.nxt;
if(first != null){
first.prev = null;
}else{
last = null;
}
num--;
}
if(first == null || last == null){
first = newNode;
last = newNode;
}else{
last.nxt = newNode;
newNode.prev = last;
last = last.nxt;
}
num ++;
}else{
n.val = value;
if(n != last){
if(n==first){
first = first.nxt;
first.prev = null;
}else{
n.nxt.prev = n.prev;
n.prev.nxt = n.nxt;
}
last.nxt = n;
n.prev = last;
n.nxt = null;
last = n;
}
}
}
}