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;
}
}
Map<Integer, DLinkedNode> map;
int capacity;
DLinkedNode head, tail;
public LRUCache(int capacity) {
this.capacity = capacity;
map = new HashMap<>();
head = new DLinkedNode();
tail = new DLinkedNode();
head.next = tail;
tail.pre = head;
}
public int get(int key) {
DLinkedNode node = map.get(key);
if (node == null) return -1;
moveToHead(node);
return node.value;
}
public void put(int key, int value) {
DLinkedNode node = new DLinkedNode(key, value);
DLinkedNode old = map.get(key);
if (old == null) {
if (map.size() == capacity){
DLinkedNode T = removeTail();
map.remove(T.key);
}
}
else {
removeNode(old);
}
addToHead(node);
map.put(key, node);
}
private void moveToHead(DLinkedNode node) {
removeNode(node);
addToHead(node);
}
private void addToHead(DLinkedNode node) {
head.next.pre = node;
node.next = head.next;
head.next = node;
node.pre = head;
}
private DLinkedNode removeTail() {
DLinkedNode node = tail.pre;
removeNode(node);
return node;
}
private void removeNode(DLinkedNode node) {
node.pre.next = node.next;
node.next.pre = node.pre;
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/
LRU缓存 Java实现
最新推荐文章于 2024-08-05 13:24:57 发布