? LRU Cache
获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lru-cache
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
---- java
class LinkedNode {
int key;
int value;
LinkedNode font;
LinkedNode next;
LinkedNode(int key, int value){
this.key = key;
this.value =value;
}
}
class LRUCache {
private int capacity;
private HashMap<Integer,LinkedNode> map = new HashMap();
private LinkedNode head;
private LinkedNode tail;
public LRUCache(int capacity) {
this.capacity =capacity;
head = new LinkedNode(0,0);
tail = new LinkedNode(0,0);
head.next = tail;
tail.font = head;
}
public int get(int key) {
if(map.containsKey(key)){
LinkedNode node = map.get(key);
moveHead(node);
return node.value;
}else{
return -1;
}
}
public void put(int key, int value) {
if(!map.containsKey(key)){
if(map.size() == this.capacity){
deleteTailNode();
}
LinkedNode curNode = new LinkedNode(key,value);
LinkedNode temp = head.next;
head.next = curNode;
curNode.font= head;
curNode.next = temp;
temp.font = curNode;
map.put(key,curNode);
}
else{
LinkedNode curNode = map.get(key);
curNode.value = value;
moveHead(curNode);
}
}
private void deleteTailNode(){
LinkedNode curNode = tail.font;
tail.font = curNode.font;
curNode.font.next = tail;
map.remove(curNode.key);
}
private void moveHead(LinkedNode node){
node.font.next = node.next;
node.next.font = node.font;
LinkedNode temp = head.next;
head.next= node;
node.font = head;
node.next =temp;
temp.font = node;
}
}
/**
* 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);
*/