#include <map>
struct LinkNode
{
LinkNode* prev = NULL;
LinkNode* next = NULL;
int key;
int value;
LinkNode() = default;
LinkNode(int key, int value) : key(key), value(value), prev(NULL), next(NULL){};
};
class LRUCache {
private:
int capacity = 0;
int size = 0;
unordered_map<int, LinkNode*> mmap;
LinkNode* head = NULL;
LinkNode* tail = NULL;
public:
LRUCache(int capacity) {
this -> capacity = capacity;
head = new LinkNode;
tail = new LinkNode;
head -> next = tail;
tail -> next = head; // double linklist
}
int get(int key) {
if(mmap.find(key) != mmap.end()){ // if find it , the node need remove to the head
LinkNode* node = mmap.at(key);
node -> next -> prev = node -> prev;
node -> prev -> next = node -> next;
node -> next = head -> next;
head -> next -> prev = node;
head -> next = node;
node -> prev = head;
return node -> value;
}else{
return -1;
}
}
void put(int key, int value) {
if(get(key) != -1){ // find it
head -> next -> value = value; // get now the head -> next whill be the node ,update the value
return;
}
if(mmap.count(key)==0){
++size;
}
if(size > capacity){
LinkNode* destroy = tail -> prev;
tail -> prev = destroy -> prev;
destroy -> prev -> next = tail;
mmap.erase(destroy -> key);
delete destroy;
--size;
}
LinkNode* newNode = new LinkNode(key, value);
newNode -> next = head -> next;
head -> next -> prev = newNode;
newNode -> prev = head;
head -> next = newNode;
mmap[key] = newNode;
}
};
/**
* 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);
*/
leetcode146 LRU Cache
最新推荐文章于 2025-05-09 14:48:06 发布