https://leetcode.com/problems/lru-cache/
使用map加雙向鏈表的方式來存儲,get的時候,通過map獲取數據,put的時候,通過雙向鏈表的特性,可以在常量時間移動節點到頭部,刪除尾部節點。
class DoubleLinkNode {
public DoubleLinkNode prev = null;
public DoubleLinkNode next = null;
public int key = 0;
public int val = 0;
public DoubleLinkNode(int key, int val, DoubleLinkNode prev, DoubleLinkNode next) {
this.key = key;
this.val = val;
this.prev = prev;
this.next = next;
}
}
class LRUCache {
int mCap = 0;
int mLen = 0;
DoubleLinkNode head;
DoubleLinkNode tail;
Map<Integer, DoubleLinkNode> maps = new HashMap<>();
public LRUCache(int capacity) {
mCap = capacity;
head = new DoubleLinkNode(0,0, null, null);
tail = new DoubleLinkNode(0, 0, null, null);
head.next = tail;
tail.prev = head;
}
public int get(int key) {
if (maps.containsKey(key)) {
DoubleLinkNode node = maps.get(key);
DoubleLinkNode prev = node.prev;
DoubleLinkNode next = node.next;
prev.next = next;
next.prev = prev;
node.next = head.next;
head.next.prev = node;
head.next = node;
node.prev = head;
return node.val;
} else {
return -1;
}
}
public void put(int key, int value) {
if (maps.containsKey(key)) {
DoubleLinkNode node = maps.get(key);
node.val = value;
DoubleLinkNode prev = node.prev;
DoubleLinkNode next = node.next;
prev.next = next;
next.prev = prev;
node.next = head.next;
head.next.prev = node;
head.next = node;
node.prev = head;
} else {
DoubleLinkNode node = new DoubleLinkNode(key, value, head, null);
node.next = head.next;
head.next.prev = node;
head.next = node;
node.prev = head;
mLen++;
if (mLen > mCap) {
maps.remove(tail.prev.key);
DoubleLinkNode newTailPrev = tail.prev.prev;
newTailPrev.next = tail;
tail.prev = newTailPrev;
mLen--;
}
maps.put(key, node);
}
}
}