Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and set
.
get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.set(key, value)
- Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
思考:第一次遇到这种题目,说实话我实在构造不出这么好的数据结构:map+双向链表。
struct Node{ int key; int value; Node *pre; Node *next; Node(int a,int b):key(a),value(b),pre(NULL),next(NULL){}; };//双向链表数据结构 class LRUCache{ private: int maxsize; Node *head;//链表头结点 Node *tail;//链表尾结点 map<int,Node*> m; public: LRUCache(int capacity) { maxsize=capacity; head=NULL; tail=NULL; m.clear(); } int get(int key) { map<int,Node*>::iterator iter=m.find(key); if(iter!=m.end())//找到key返回value,将结点移到链表头部 { move(iter->second); return iter->second->value; } else return -1; } void set(int key, int value) { map<int,Node*>::iterator iter=m.find(key); if(iter!=m.end())//已存在key { Node *p=iter->second; p->value=value; move(p); } else//不存在key { if(m.size()==maxsize)//链表满删除尾结点 { iter=m.find(tail->key); m.erase(iter); Node *p=tail; if(p->pre==NULL) head=NULL; else p->pre->next=NULL; tail=tail->pre; delete p; } insert(key,value); } } void insert(int key,int value)//插入到头结点 { Node *node=new Node(key,value); if(head==NULL) head=tail=node; else { head->pre=node; node->pre=NULL; node->next=head; head=node; } m.insert(make_pair(key,node)); } void move(Node *node)//移动到头结点 { if(node==head) return; if(node==tail) tail=node->pre; node->pre->next=node->next; if(node->next!=NULL) node->next->pre=node->pre; node->pre=NULL; node->next=head; head->pre=node; head=node; } };