老是想的是deque,然而要想想双向链表的插入删除复杂度才为O(1)呀!!!
题目连接:https://leetcode-cn.com/problems/lru-cache/
struct BidirectionalNode
{
BidirectionalNode* prev;
BidirectionalNode* next;
int key;
int value;
BidirectionalNode():key(0),value(0),prev(nullptr),next(nullptr)
{
}
BidirectionalNode(int k,int v):key(k),value(v),prev(nullptr),next(nullptr)
{
}
};
class LRUCache {
private:
int _capacity;
int cur_size;
BidirectionalNode* head; //使用伪头部和伪尾部结点
BidirectionalNode* tail;
unordered_map<int,BidirectionalNode*>cache; // 将关键字和双向链表结点的地址链接起来
public:
LRUCache(int capacity): _capacity(capacity),cur_size(0){
head=new BidirectionalNode();
tail=new BidirectionalNode();
head->next=tail;
tail->prev=head;
}
int get(int key) {
if(cache.count(key))
{
BidirectionalNode* node=cache[key];
removeToHead(node);
return node->value;
}
else
{
return -1;
}
}
void put(int key, int value) {
if(cache.count(key))
{
BidirectionalNode* node=cache[key];
node->value=value;
removeToHead(node);
}
else
{
BidirectionalNode* node=new BidirectionalNode(key,value);
cache.insert(make_pair(key,node));
addToHead(node);
cur_size++;
if(cur_size>_capacity)
{
BidirectionalNode*remove_node= removeFromTail();
cache.erase(remove_node->key);
cur_size--;
delete(remove_node); //先调用析构函数,再释放内存
}
}
}
void removeToHead(BidirectionalNode* node)
{
removeNode(node);
addToHead(node);
}
void removeNode(BidirectionalNode* node)
{
if(node->prev==nullptr)cout<<"NULL"<<endl;
node->prev->next=node->next;
node->next->prev=node->prev;
}
void addToHead(BidirectionalNode* node)
{
node->next=head->next;
node->prev=head;
head->next->prev=node;
head->next=node;
}
BidirectionalNode* removeFromTail()
{
BidirectionalNode* node= tail->prev;
removeNode(node);
return 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);
*/