class LRUCache {
public:
struct Node{
int key;
int value;
Node* left;
Node* right;
Node(int _key, int _value): key(_key),value(_value),left(NULL),right(NULL){}
}*L, *R;
int n;
unordered_map<int, Node*> hash;
void remove(Node* p)
{
p->left->right = p->right;
p->right->left = p->left;
}
void insert(Node* p)//插在头部
{
p->left = L;
p->right = L->right;
L->right->left = p;
L->right = p;
/*L->right = p;顺序千万别乱
L->right->left = p;*/
return;
}
LRUCache(int capacity) {
n = capacity;
L = new Node(-1,-1);
R = new Node(-1,-1);
L->right = R;//注意头部和尾部
R->left = L;
}
int get(int key) {
if(hash.count(key) == 0) return -1;
auto p = hash[key];
remove(p);//删除当前位置
insert(p);//放在头部
return p->value;
}
void put(int key, int value) {
if(hash.count(key) == 0)//如果不再当前lru cache中
{
if(hash.size() == n)//缓存满了
{
auto p = R->left;
if(p == NULL)
return;
remove(p);
hash.erase(p->key);
delete p;
}
//没有满,直接插入
auto p = new Node(key,value);
hash[key] = p;
insert(p);
}
else //在当前lru缓存中
{
auto p = hash[key];
p->value = value;
remove(p);
insert(p);
}
}
};