public class LRUCache {
private Map<Integer, Node> map;
private int capacity;
private Node first;
private Node last;
public LRUCache(int capacity) {
map = new HashMap<>(capacity);
this.capacity = capacity;
first = new Node();
last = new Node();
first.next = last;
last.prev = first;
}
public int get(int key) {
Node node = map.get(key);
if (node == null)
return -1;
removeNode(node);
addAfterFirst(node);
return node.value;
}
public void put(int key, int value) {
Node node = map.get(key);
if (node != null) {
node.value = value;
removeNode(node);
} else {
if (map.size() == capacity) {
// 淘汰最少使用的node
removeNode(map.remove(last.prev.key));
}
map.put(key, node = new Node(key, value));
}
addAfterFirst(node);
}
private void removeNode(Node node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
private void addAfterFirst(Node node) {
first.next.prev = node;
node.next = first.next;
first.next = node;
node.prev = first;
}
private static class Node {
public int key;
public int value;
public Node prev;
public Node next;
public Node(int key, int value) {
super();
this.key = key;
this.value = value;
}
public Node() {
}
}
}
leetcode_146_LRU缓存机制
最新推荐文章于 2022-09-30 22:54:56 发布