Untitled
unknown
plain_text
8 months ago
2.1 kB
13
Indexable
struct Node {
int key, val;
Node *next, *prev;
Node(int key, int val) {
this->key=key;
this->val=val;
this->next=NULL;
this->prev=NULL;
}
};
class LRUCache {
int cap, totalNodes;
unordered_map<int,Node*> nodeMap;
Node *head, *tail;
void moveHead() {
head->next->prev=NULL;
head=head->next;
}
void removeNode(Node *node) {
node->prev->next=node->next;
node->next->prev=node->prev;
}
void moveNodeToTail(Node *node) {
tail->next=node;
node->prev=tail;
tail=node;
}
public:
LRUCache(int capacity) {
this->cap=capacity;
this->totalNodes=0;
}
int get(int key) {
if(nodeMap.find(key)!=nodeMap.end()) {
Node *node=nodeMap[key];
if(tail==node)return node->val;
else if(head==node)moveHead();
else removeNode(node);
moveNodeToTail(node);
return node->val;
}
return -1;
}
void put(int key, int value) {
if(nodeMap.find(key)!=nodeMap.end()){
Node *node=nodeMap[key];
node->val=value;
if(tail==node)return;
else if(head==node)moveHead();
else removeNode(node);
moveNodeToTail(node);
}
else {
Node *node=new Node(key,value);
nodeMap[key]=node;
if(totalNodes==0){
head=node;
tail=node;
totalNodes++;
return;
}
moveNodeToTail(node);
totalNodes++;
if(cap<totalNodes){
nodeMap.erase(head->key);
moveHead();
totalNodes=cap;
}
}
}
};
/**
* 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);
*/Editor is loading...
Leave a Comment