这题主要考察数据结构,想要快速access 就想到array 但是有key value所以要用hashmap 加上需要在访问过后 放到队头 capacity满了之后要删除队尾 所以要用double linked list
写的时候有很多细节,每次get和set都要注意把这个节点放到队头(或尾)这时候要看这个节点是不是本来就在队头。还有就是内部的node class 也就是double linked list也要有key 这方便后面找某个节点的key。最后就是set时要判断假如没有节点了怎么办。同时每次更新列表的时候也要记得更新hashmap
public class LRUCache {
class Node {
Node pre,next;
int value;
int key;
public Node ( int key, int val ){
this.value = val;
this.key = key;
this.pre = null;
this.next = null;
}
}
private int cap;
private int num;
private HashMap<Integer,Node> map;
private Node head,tail;
public LRUCache(int capacity) {
this.cap = capacity;
this.map = new HashMap<Integer,Node>();
this.head = null;
this.tail = null;
this.num = 0;
}
public int get(int key) {
Node node = this.map.get(key);
if ( node == null ){
return -1;
}
else{
if ( node != tail ){
if ( node == head){
head = head.next;
}
else{
node.pre.next = node.next;
}
node.next.pre = node.pre;
tail.next = node;
node.pre = tail;
node.next = null;
tail = node;
}
}
return node.value;
}
public void set(int key, int value) {
Node node = this.map.get(key);
if( node != null){
node.value = value;
if ( node != tail ){
if ( node == head){
head = head.next;
node.next.pre = null;
}
else{
node.pre.next = node.next;
node.next.pre = node.pre;
}
tail.next = node;
node.pre = tail;
node.next = null;
tail = node;
}
}
else{
Node newNode = new Node(key,value);
if ( num >= cap ){
map.remove(head.key);
head = head.next;
if ( head != null )
head.pre = null;
else
tail = null;
num--;
}
if (tail == null || head == null){
head = newNode;
tail = newNode;
num ++;
map.put(key,newNode);
}
else {
tail.next = newNode;
newNode.pre = tail;
newNode.next = null;
tail = newNode;
num ++;
map.put(key,newNode);
}
}
}
}