class Node
{
public:
Node(int keyp,int valp)
{
key = keyp;
val = valp;
next = NULL;
pre = NULL;
}
public:
int key;
int val;
Node*next;
Node*pre;
};
class LRUCache
{
public:
LRUCache(int capacity)
{
m_count = 0;
m_cap = capacity;
m_head = new Node(-1,-1);
m_tail = new Node(-1,-1);
m_head->next =m_tail;
m_tail->pre = m_head;
}
int get(int key)
{
if(myLRUMap.find(key) != myLRUMap.end())
{
Node* moveNode = myLRUMap[key];
moveNode->pre->next = moveNode->next;
moveNode->next->pre = moveNode->pre;
moveNode->next = m_tail;
moveNode->pre = m_tail->pre;
m_tail->pre->next = moveNode;
m_tail->pre = moveNode;
return myLRUMap[key]->val;
}
else
{
return -1;
}
}
void put(int keypar,int valpar)
{
if(myLRUMap.find(keypar) != myLRUMap.end())
{
//更新值,更新位置
Node* moveNode = myLRUMap[keypar];
moveNode->pre->next = moveNode->next;
moveNode->next->pre = moveNode->pre;
moveNode->next = m_tail;
moveNode->pre = m_tail->pre;
m_tail->pre->next = moveNode;
m_tail->pre = moveNode;
myLRUMap[keypar]->val = valpar;
}
else
{
Node* tempNode = new Node(keypar,valpar);
myLRUMap[keypar] = tempNode;
m_tail->pre->next = tempNode;
tempNode->pre = m_tail->pre;
tempNode->next = m_tail;
m_tail->pre = tempNode;
if(m_count<m_cap) m_count++;
else
{
//删除头部
Node* delNode = m_head->next;
m_head->next = delNode->next;
delNode->next->pre = m_head;
myLRUMap.erase(delNode->key);
}
}
}
private:
int m_cap;
int m_count;
Node* m_head;
Node* m_tail;
unordered_map<int,Node*>myLRUMap;
};
int main()
{
LRUCache Lru(2);
Lru.put(1,1);
Lru.put(2,2);
int a = 0;
a= Lru.get(1);
return 0;
}