class LRUCache{
public:
LRUCache(int capacity) {
cap=capacity;
head=new ListNode(0,0);
tail=new ListNode(0,0);
head->left=NULL;
head->right=tail;
tail->right=NULL;
tail->left=head;
}
int get(int key) {
int value;
Data::iterator iter=datas.find(key);
if(iter!=datas.end())
{
value=iter->second->value;
if(datas.size()==1)
{
return value;
}
else
{
DeleteNode(iter->second);
InsertNode(iter->second);
return value;
}
}
else
{
return -1;
}
}
void set(int key, int value) {
Data::iterator iter=datas.find(key);
if(iter!=datas.end())
{
iter->second->value=value;
DeleteNode(iter->second);
InsertNode(iter->second);
return;
}
if(datas.size()<cap)
{
ListNode *newnode=new ListNode(key,value);
InsertNode(newnode);
datas[key]=newnode;
}
else
{
ListNode *node=head->right;
DeleteNode(node);
InsertNode(node);
datas.erase(node->key);
datas[key]=node;
node->key=key;
node->value=value;
}
}
~LRUCache()
{
ListNode *next;
while(head)
{
next=head->right;
delete head;
head=next;
}
}
private:
struct ListNode
{
int key;
int value;
ListNode *left;
ListNode *right;
ListNode(int k,int v):key(k),value(v),left(NULL),right(NULL){}
};
typedef map<int,ListNode*> Data;
Data datas;
ListNode *head,*tail;
int cap;
void DeleteNode(ListNode *node)
{
node->left->right=node->right;
node->right->left=node->left;
}
void InsertNode(ListNode *node)
{
ListNode *last=tail->left;
last->right=node;
node->left=last;
node->right=tail;
tail->left=node;
}
};
public:
LRUCache(int capacity) {
cap=capacity;
head=new ListNode(0,0);
tail=new ListNode(0,0);
head->left=NULL;
head->right=tail;
tail->right=NULL;
tail->left=head;
}
int get(int key) {
int value;
Data::iterator iter=datas.find(key);
if(iter!=datas.end())
{
value=iter->second->value;
if(datas.size()==1)
{
return value;
}
else
{
DeleteNode(iter->second);
InsertNode(iter->second);
return value;
}
}
else
{
return -1;
}
}
void set(int key, int value) {
Data::iterator iter=datas.find(key);
if(iter!=datas.end())
{
iter->second->value=value;
DeleteNode(iter->second);
InsertNode(iter->second);
return;
}
if(datas.size()<cap)
{
ListNode *newnode=new ListNode(key,value);
InsertNode(newnode);
datas[key]=newnode;
}
else
{
ListNode *node=head->right;
DeleteNode(node);
InsertNode(node);
datas.erase(node->key);
datas[key]=node;
node->key=key;
node->value=value;
}
}
~LRUCache()
{
ListNode *next;
while(head)
{
next=head->right;
delete head;
head=next;
}
}
private:
struct ListNode
{
int key;
int value;
ListNode *left;
ListNode *right;
ListNode(int k,int v):key(k),value(v),left(NULL),right(NULL){}
};
typedef map<int,ListNode*> Data;
Data datas;
ListNode *head,*tail;
int cap;
void DeleteNode(ListNode *node)
{
node->left->right=node->right;
node->right->left=node->left;
}
void InsertNode(ListNode *node)
{
ListNode *last=tail->left;
last->right=node;
node->left=last;
node->right=tail;
tail->left=node;
}
};