class LRUCache {
public:
struct Node{
int key;
Node *pre, *next;
Node(int x):key(x),pre(NULL),next(NULL){}
};
int tot, c;
Node *head, *tail;
unordered_map<int, pair<int, Node*>>dic;
LRUCache(int capacity) {
tot=0;
c=capacity;
auto l1=new Node(-1);
auto l2=new Node(-1);
head=l1,tail=l2;
head->next=tail;
tail->pre=head;
}
int get(int key) {
if(dic.find(key)==dic.end())return -1;
Node *node=dic[key].second;
node->pre->next=node->next;
node->next->pre=node->pre;
node->next=tail;
node->pre=tail->pre;
tail->pre->next=node;
tail->pre=node;
return dic[key].first;
}
void put(int key, int value) {
if(dic.find(key)!=dic.end()){
dic[key].first=value;
Node *node=dic[key].second;
node->pre->next=node->next;
node->next->pre=node->pre;
node->next=tail;
node->pre=tail->pre;
tail->pre->next=node;
tail->pre=node;
}else{
if(tot==c){
Node *node=head->next;
dic.erase(node->key);
head->next=node->next;
node->next->pre=head;
delete node;
tot--;
}
Node *node=new Node(key);
dic[key]=make_pair(value, node);
node->next=tail;
tail->pre->next=node;
node->pre=tail->pre;
tail->pre=node;
tot++;
}
}
};
/**
* 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);
*/