#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
LRU缓存算法实现
最新推荐文章于 2025-12-03 23:35:37 发布
本文详细介绍了一种使用双向链表和哈希表实现的LRU(最近最少使用)缓存算法。通过具体代码展示了如何在插入新元素或访问已有元素时保持缓存的有效性和高效性,同时确保缓存大小不超过预设容量。
1417

被折叠的 条评论
为什么被折叠?



