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.
实现LRU
用HashMap+LinkedList实现
public class LRUCache {
static class ListNode {
int key;
int value;
ListNode next;
ListNode pre;
ListNode(int key,int value) {
this.key = key;
this.value = value;
pre = null;
next = null;
}
}
private Map<Integer, ListNode> map;
private int size;
private int capacity;
private ListNode head;
private ListNode tail;
public LRUCache(int capacity) {
if(capacity<1)
return;
map = new HashMap<Integer, ListNode>();
size = 0;
this.capacity = capacity;
head = new ListNode(-1,-1);
tail = new ListNode(-1,-1);
head.next = tail;
tail.pre = head;
}
public int get(int key) {
if(map.containsKey(key)){
ListNode tmp = map.get(key);
tmp.pre.next=tmp.next;
tmp.next.pre=tmp.pre;
head.next.pre=tmp;
tmp.next=head.next;
tmp.pre=head;
head.next=tmp;
return tmp.value;
}
return -1;
}
public void set(int key, int value) {
if(map.containsKey(key)){
ListNode tmp = map.get(key);
tmp.pre.next=tmp.next;
tmp.next.pre=tmp.pre;
head.next.pre=tmp;
tmp.next=head.next;
tmp.pre=head;
head.next=tmp;
tmp.value=value;
}else {
if(size==capacity){
map.remove(tail.pre.key);
tail.pre.pre.next=tail;
tail.pre=tail.pre.pre;
ListNode tmp = new ListNode(key,value);
map.put(key, tmp);
head.next.pre=tmp;
tmp.next=head.next;
tmp.pre=head;
head.next=tmp;
}else if(size<capacity){
ListNode tmp = new ListNode(key,value);
map.put(key, tmp);
head.next.pre=tmp;
tmp.next=head.next;
tmp.pre=head;
head.next=tmp;
size++;
}
}
}
}