题目
Node要存储key,因为要删除tail时,也需要从map里面删除,然后删除的时候需要key,所以tail节点里面要含有tail对应的key。
别忘了 remove(now)时更新相应的head,tail。
class LRUCache {
public:
struct Node{
int key,val;
Node *pre,*next;
Node(int _key,int _val):key(_key),val(_val),pre(NULL),next(NULL){}
}*head,*tail;
void tofirst(Node *x){
if(!head) head=tail=x;
else x->next=head,head=head->pre=x;
}
void remove(Node *y){
Node *x=y->pre,*z=y->next;
x?(x->next=z):(head=z);
z?(z->pre=x):(tail=x);
delete y;
}
public:
int cap,sz;
map<int,Node*>mp;
LRUCache(int _cap):cap(_cap),sz(0),head(NULL),tail(NULL){}
int get(int key) {
if(!mp.count(key)) return -1;
int val=mp[key]->val;
remove(mp[key]),tofirst(mp[key]=new Node(key,val));
return val;
}
void put(int key, int value) {
if(!cap) return;
if(mp.count(key)) remove(mp[key]);
else if(++sz>cap){--sz,mp.erase(mp.find(tail->key)),remove(tail);}
tofirst(mp[key]=new Node(key,value));
}
};