变量简洁正确完整思路
class LRUCache { public: LRUCache(int capacity) :maxCapacity(capacity){} int get(int key) { if(!key2node.count(key))return -1; cache.splice(cache.begin(),cache,key2node[key]); return key2node[key]->second; } void put(int key, int value) { if(key2node.count(key))cache.erase(key2node[key]); if(cache.size()==maxCapacity){ key2node.erase(cache.back().first); cache.pop_back(); } cache.push_front({key,value}); key2node[key]=cache.begin(); } private: list<pair<int,int>>cache; unordered_map<int,list<pair<int,int>>::iterator>key2node; int maxCapacity; };
struct Node{ Node(int key,int value):key(key),value(value){} int key; int value; Node *prev; Node *next; }; class myList{ public: myList(){ head=new Node(-1,-1); tail=new Node(-1,-1); head->next=tail; tail->prev=head; mSize=0; } void splice(Node *it1, myList l2, Node*it2){ it2->prev->next=it2->next; it2->next->prev=it2->prev; it2->prev=it1->prev; it2->next=it1; it1->prev->next=it2; it1->next->prev=it2; mSize++; } Node *begin() { return head->next; } void erase(Node *it) { it->prev = it->next; mSize--; delete it; } int size() { return mSize; } Node* back() { return tail->prev; } void pop_back(){ tail = tail->prev; mSize--; delete tail->next; } void push_front(Node*node){ node->prev = head; node->next = head->next; head->next = node; node->next->prev = node; mSize++; } private: Node* head,*tail; int mSize; }; class LRUCache { public: LRUCache(int capacity) :maxCapacity(capacity){} int get(int key) { if(!key2node.count(key))return -1; cache.splice(cache.begin(),cache,key2node[key]); return key2node[key]->value; } void put(int key, int value) { if(key2node.count(key))cache.erase(key2node[key]); if(cache.size()==maxCapacity){ key2node.erase(cache.back()->key); cache.pop_back(); } Node *node =new Node(key, value); cache.push_front(node); key2node[key]=cache.begin(); } private: myList cache; unordered_map<int,Node*>key2node; int maxCapacity; };
原文:https://www.cnblogs.com/zhouzihong/p/15099908.html