LeetCode-146. LRU缓存机制
import java.util.HashMap;
import java.util.Map;
public class LRUCache {
private Map<Integer, ListNode> map;
private class ListNode {
private Integer key;
private Integer value;
private ListNode pre;
private ListNode next;
public ListNode() {
}
public ListNode(Integer key, Integer value) {
this.key = key;
this.value = value;
}
}
private int capacity;
private ListNode dummyHead;
private ListNode dummyTail;
public LRUCache(int capacity) {
map = new HashMap<>(capacity);
this.capacity = capacity;
dummyHead = new ListNode(-1, -1);
dummyTail = new ListNode(-1, -1);
dummyHead.next = dummyTail;
dummyTail.pre = dummyHead;
}
public int get(int key) {
if (map.containsKey(key)) {
ListNode node = map.get(key);
int val = node.value;
moveNode2Head(key);
return val;
} else {
return -1;
}
}
public void put(int key, int value) {
if (map.containsKey(key)) {
map.get(key).value = value;
moveNode2Head(key);
return;
}
if (map.size() == capacity) {
ListNode oldTail = removeTail();
map.remove(oldTail.key);
}
ListNode newNode = new ListNode(key, value);
map.put(key, newNode);
addNode2Head(newNode);
}
private ListNode removeTail() {
ListNode oldTail = dummyTail.pre;
ListNode newTail = oldTail.pre;
newTail.next = dummyTail;
dummyTail.pre = newTail;
oldTail.pre = null;
oldTail.next = null;
return oldTail;
}
private void moveNode2Head(int key) {
ListNode node = map.get(key);
node.pre.next = node.next;
node.next.pre = node.pre;
addNode2Head(node);
}
private void addNode2Head(ListNode newNode) {
ListNode oldHead = dummyHead.next;
oldHead.pre = newNode;
newNode.pre = dummyHead;
newNode.next = oldHead;
dummyHead.next = newNode;
}
public static void main(String[] args) {
LRUCache cache = new LRUCache(2);
cache.put(1, 1);
cache.put(2, 2);
System.out.println(cache.map.keySet());
int res1 = cache.get(1);
System.out.println(res1);
cache.put(3, 3);
int res2 = cache.get(2);
System.out.println(res2);
int res3 = cache.get(3);
System.out.println(res3);
cache.put(4, 4);
System.out.println(cache.map.keySet());
int res4 = cache.get(1);
System.out.println(res4);
int res5 = cache.get(3);
System.out.println(res5);
int res6 = cache.get(4);
System.out.println(res6);
}
}
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/lru-cache/solution/ha-xi-biao-shuang-xiang-lian-biao-java-by-liweiw-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。