Untitled
unknown
plain_text
21 days ago
2.1 kB
10
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