力扣链接:. - 力扣(LeetCode)
思路:双向链表用来维护"最近最少使用",hashmap用来比较方便的根据key取value
java
class LRUCache {
class Node{
Node pre;
Node next;
int key, val;
Node(){}
Node(int key, int val){
this.key = key;
this.val = val;
}
}
private int capacity;
private Map<Integer, Node> cache;
//分别指向头尾节点,便于在头部插入和在尾部删除节点
private Node head, tail;
public LRUCache(int capacity) {
this.capacity = capacity;
this.cache = new HashMap<>();
head = new Node();
tail = new Node();
head.next = tail;
tail.pre = head;
}
public int get(int key) {
Node node = cache.get(key);
if(node == null) return -1;
//如果存在,则移到头部
moveToHead(node);
return node.val;
}
public void put(int key, int value) {
Node node = cache.get(key);
if(node != null) {
node.val = value;
moveToHead(node);
} else {
Node newNode = new Node(key, value);
//如果容量超了,先移除
if(cache.size()==capacity){
Node realTail = tail.pre;
removeNode(realTail);
cache.remove(realTail.key);
}
addHead(newNode);
cache.put(key, newNode);
}
}
private void moveToHead(Node node) {
removeNode(node);
addHead(node);
}
private void removeNode(Node node) {
Node nextNode = node.next;
Node preNode = node.pre;
preNode.next = nextNode;
nextNode.pre = preNode;
}
private void addHead(Node node) {
node.next = head.next;
head.next.pre = node;
node.pre = head;
head.next = node;
}
}