Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and set
.
get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value)
- Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
使用内部类Node存储插入的数据,map存储key和Node的对应关系;
get和set是要将该节点放置在head处,解法中使用head和end两个指针帮助头结点的设置和末节点的删除
public class LRUCache {
class Node{
public Node pre;
public Node next;
public int value;
public int key;
public Node(int key, int value){
this.key = key;
this.value = value;
}
}
private int capacity;
private int size;
private HashMap<Integer, Node> map= new HashMap<Integer, Node>();
private Node head;
private Node end;
public LRUCache(int capacity) {
this.capacity = capacity;
size = 0;
}
public int get(int key) {
if(map.containsKey(key)){
Node lastest = map.get(key);
remove(lastest);
setHead(lastest);
return lastest.value;
}
else return -1;
}
public void set(int key, int value) {
if(map.containsKey(key)){
Node lastest = map.get(key);
remove(lastest);
setHead(lastest);
lastest.value = value;
}
else{
Node lastest = new Node(key, value);
if(size < capacity){
size++;
}
else{
map.remove(end.key);
end = end.pre;
if(end != null) end.next = null;
}
setHead(lastest);
map.put(key, lastest);
}
}
private void remove(Node cur){
Node pre = cur.pre;
Node next = cur.next;
if(pre != null){
pre.next = next;
}
else head = next;
if(next != null){
next.pre = pre;
}
else end = pre;
}
private void setHead(Node cur){
cur.next = head;
cur.pre = null;
if(head != null){
head.pre = cur;
}
head = cur;
if(end == null){
end = cur;
}
}
}