class LRUCache { public: struct Node { int key; int value; Node *prev; Node *next; }; Node *head; Node *tail; int size , capacity; unordered_map<int , Node*>mapi; LRUCache(int capacity) { this->capacity = capacity; head = new Node(); tail = new Node(); head->next = tail; tail->prev = head; size =0; } Node* insertNode(int k , int v) { Node*newnode = new Node(); newnode ->key = k; newnode->value=v; newnode->prev =head; newnode->next = head->next; newnode->next->prev = newnode; head->next = newnode; // // unordered_map<int , Node*>mapi // pair<int , int> p(k,v); mapi.erase(k); mapi[k] = newnode; return newnode; } void pushtowardsHead(Node * newnode) { if(head->next == newnode) return; newnode->prev->next = newnode->next; newnode->next->prev = newnode->prev; newnode->prev =head; newnode->next = head->next; newnode->next->prev = newnode; head->next = newnode; } void removeTail() { Node*newnode = tail ->prev; tail->prev = newnode ->prev; newnode->prev->next= tail; mapi.erase(newnode->key); } int get(int k) { if(mapi.find(k) == mapi.end()) return -1; Node* newnode =mapi[k]; pushtowardsHead(newnode); return newnode->value; } void put(int k ,int v) { if(mapi.find(k)!=mapi.end()) {//already present Node*newnode = mapi[k]; newnode->value = v; pushtowardsHead(newnode); return; } insertNode(k,v); if(size <capacity) { size++; return; } else { removeTail(); } } };
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter