structnode { int key, value; node * next; node * pre; node (int k, int v) { key = k; value = v; next = pre = NULL; } node () { key = value = 0; next = pre = NULL; } };
classLRUCache { unordered_map<int, node *>mp; node * head; node * tail; int size; int capacity; public: LRUCache(int _capacity) { capacity = _capacity; size = 0; head = new node(); tail = new node(); head -> next = tail; tail -> pre = head; } intget(int key){ if(!mp.count(key)) { return-1; } node * p = mp[key]; node * tmp1 = p -> pre; node * tmp2 = p -> next; tmp1 -> next = tmp2; tmp2 -> pre = tmp1; node * tmp3 = tail -> pre; tmp3 -> next = p; p -> next = tail; tail -> pre = p; p -> pre = tmp3;
return p -> value; } voidput(int key, int value){ if(!mp.count(key)) { node * tmp = new node(key, value); mp[key] = tmp; size++;
node * tmp2 = tail -> pre; tmp2 -> next = tmp; tmp -> next = tail; tail -> pre = tmp; tmp -> pre = tmp2; if(size > capacity) { node * p = head -> next; head -> next = p -> next; p -> next -> pre = head; mp.erase(p -> key); delete p; size--; } } else { node * p = mp[key]; p -> value = value; node * tmp1 = p -> pre; node * tmp2 = p -> next; tmp1 -> next = tmp2; tmp2 -> pre = tmp1; node * tmp3 = tail -> pre; tmp3 -> next = p; p -> next = tail; tail -> pre = p; p -> pre = tmp3; } } };
/** * 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); */