class LRUCache {
//双线链表的节点类
class DoublyListNode {
public int key;
public int val;
public DoublyListNode pre;
public DoublyListNode next;
public DoublyListNode() {}
public DoublyListNode(int val) { this.val = val; }
}
//双相链表的头节点
private DoublyListNode head;
//双线链表的尾结点
private DoublyListNode tail;
//维护索引的Map
Map<Integer,DoublyListNode> map;
//大小
int capacity;
public LRUCache(int capacity) {
//保存大小
this.capacity = capacity;
//链表头尾节点初始化,然后头尾相连形成双链表结构
head = new DoublyListNode();
tail = new DoublyListNode();
head.next = tail;
tail.pre = head;
//初始化索引MAp
map = new HashMap<>();
}
public int get(int key) {
//如果map里面没有就直接返回-1
if(!map.containsKey(key)){
return -1;
}
DoublyListNode node = map.get(key);
//从中间移除node
doublyListNodeRemove(node);
// 再 从头部插入node
doublyListNodeInsert(head,node);
return node.val;
}
public void put(int key, int value) {
//如果map里不存在这个key
if(!map.containsKey(key)){
DoublyListNode node = new DoublyListNode();
node.key = key;
node.val = value;
//保存hashMap
map.put(key,node);
//从头部插入链表
doublyListNodeInsert(head,node);
//如果超过最大长度限制了,则删除链表尾部最后一个节点,删除最后一个节点的hashMap的缓存
if(map.size() > capacity){
//清掉map的缓存,tail的pre的key
map.remove(tail.pre.key);
//删除尾部最后一个节点,也就是tald的pre
doublyListNodeRemove(tail.pre);
}
}else {
//如果存在MAP里了,就更新这个值,然在在链表中删掉,放入开头插入
DoublyListNode node = map.get(key);
node.val = value;
//从中间移除node
doublyListNodeRemove(node);
// 再 从头部插入node
doublyListNodeInsert(head,node);
}
}
/**
* 双向链表删除一个node(从中间直接删掉)
* @param node
*/
public void doublyListNodeRemove(DoublyListNode node){
node.pre.next = node.next;
node.next.pre = node.pre;
}
/**
* 双向链表。在P后面插入一个节点
* @param p
* @param node
*/
public void doublyListNodeInsert(DoublyListNode p ,DoublyListNode node){
//node 和 p的next建立联系
p.next.pre = node;
node.next = p.next;
// node 和 p 建立联系
p.next = node;
node.pre = p;
}
}