struct dListNode{ dListNode* prev; dListNode* next; int key, value; dListNode():prev(nullptr), next(nullptr), key(0), value(0){}; dListNode(int _key, int _value):prev(nullptr), next(nullptr), key(_key), value(_value){};};class LRUCache {private: unordered_map<int, dListNode*> hashmap; int capacity, size; dListNode* front; dListNode* back;public: LRUCache(int _capacity):capacity(_capacity), size(0){ front = new dListNode(); back = new dListNode(); front->next = back; back->prev = front; } int get(int key) { if(!hashmap.count(key)){ return -1; } dListNode* node = hashmap[key]; moveTohead(node); return node->value; } void put(int key, int value) { if(hashmap.count(key)){ dListNode* node = hashmap[key]; node->value = value; moveTohead(node); }else{ dListNode* node = new dListNode(key, value); addTohead(node); size ++; hashmap[key] = node; if(size > capacity){ dListNode* tail = removeTail(); size --; hashmap.erase(tail->key); delete tail; } } } void addTohead(dListNode* node){ dListNode* nex = front->next; front->next = node; node->prev = front; node->next = nex; nex->prev = node; } void removeNode(dListNode* node){ node->prev->next = node->next; node->next->prev = node->prev; } void moveTohead(dListNode* node){ removeNode(node); addTohead(node); } dListNode* removeTail(){ dListNode* tail = back->prev; removeNode(tail); return tail; }};