146. LRU 缓存
- 超时的思路
class Node {
public:
int val;
int key;
Node * pre, * next;
Node(int k,int v):val(v), key(k), pre(NULL), next(NULL){}
Node():pre(NULL), next(NULL){}
};
class LRUCache {
private:
int cap, size = 0;
Node * head, *p, *tail;
unordered_map<int, Node*> cache;
public:
LRUCache(int capacity) {
cap = capacity;
head = new Node();
tail = new Node();
head->next = tail;
tail->pre = head;
}
int get(int key) {
if (cache.count(key) == 0) return -1;
p = cache[key];
deleteNode(p);
addToHead(p);
return p->val;
}
void put(int key, int value) {
Node * now = new Node(key, value);
if (cache.count(key) != 0) {
deleteNode(cache[key]);
addToHead(now);
cout<<"++++cache[key] "<<cache[key]->key<<endl;
return;
}
addToHead(now);
if (size > cap) {
deleteNode(tail->pre);
}
printNodeList();
}
void addToHead(Node * now) {
head->next->pre = now;
now->next = head->next;
head->next = now;
now->pre = head;
cache[now->key] = now;
size++;
}
void deleteNode(Node * now) {
now->pre->next = now->next;
now->next->pre = now->pre;
cache.erase(now->key);
size--;
}
};