题意:
原题链接
代码:
struct DoubleListNode {
DoubleListNode* prev, *next;
int key;
int val;
DoubleListNode() : prev(NULL), next(NULL), key(-1), val(-1){
}
DoubleListNode(int key, int val) : prev(NULL), next(NULL), key(key), val(val){
}
};
class LRUCache {
public:
int size;
int capacity;
DoubleListNode *head, *tail;
unordered_map<int, DoubleListNode*> hash;
LRUCache(int _capacity) {
size = 0;
capacity = _capacity;
head = new DoubleListNode();
tail = new DoubleListNode();
head->next = tail;
tail->prev = head;
}
void addNode(DoubleListNode* node) {
node->next = tail;
node->prev = tail->prev;
tail->prev->next = node;
tail->prev = node;
}
void removeNode(DoubleListNode* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
int get(int key) {
if(!hash.count(key)) return -1;
DoubleListNode *tmp = hash[key];
removeNode(tmp);
addNode(tmp);
return tmp->val;
}
void put(int key, int value) {
if(!hash.count(key)) {
if(size >= capacity) {
hash.erase(head->next->key);
removeNode(head->next);
--size;
}
DoubleListNode* node = new DoubleListNode(key, value);
hash[key] = node;
addNode(node);
++size;
} else {
removeNode(hash[key]);
hash[key]->val = value;
addNode(hash[key]);
}
}
};
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache* obj = new LRUCache(capacity);
* int param_1 = obj->get(key);
* obj->put(key,value);
*/