使用双向链表来表示最久未使用的结点,最久未使用的结点放在了尾部
使用哈希表来存放真正的数据
class LRUCache{
class DLinkedNode{
int key;
int value;
DLinkedNode pre;
DLinkedNode next;
public DLinkedNode(){}
public DLinkedNode(int key,int value){
this.key = key;
this.value = value;
}
}
int capacity; //容量
int size; //实际大小,当size超过capacity时,删除最久未使用的结点
Map<Integer,DLinkedNode> cache = new HashMap<>();//哈希表用来存放真正的数据
DLinkedNode head,tail;//添加首尾结点方便移动结点
public LRUCache(int capacity){
this.capacity = capacity;
this.size = 0;
head = new DLinkedNode();
tail = new DLinkedNode();
head.next = tail;
tail.pre = head;
}
public int get(int key){
DLinkedNode temp = map.get(key);
if(key == null){
return -1;
}
moveToHead(temp);//将该结点移动到头部
return temp.value;
}
public voide put(int key,int value){
DLinkedNode temp = map.get(key);
if(temp == null)
{
DLinkedNode node = new DLinkedNode(key,value);
map.put(key,node);
addToHead(node);
++size;
if(size > capacity)
{
DLinkedNode removeNode = removeTail();
map.remove(removeNode.key);
}
}else{
temp.value = value;// 如果已经存在的话,就更新哈希表中的 key value 不需要更新双向链表 因为数据真正存储在了哈希表
moveToHead(temp);
}
}
public move moveToHead(DLinkedNode node){
node.pre.next = node.next;
node.next.pre = node.pre;
addToHead(node);
}
public DLinkedNode removeTail(){
DLinkedNode res = tail.pre;
res.pre.next = tail;
tail.pre = res.pre;
return res;
}
public voi addToHead(DLinkedNode node){
node.pre = head;
node.next = head.next;
head.next.pre = node;
head.next = node;
}
}