mirror of https://github.com/doocs/leetcode.git
91 lines
1.8 KiB
C++
91 lines
1.8 KiB
C++
struct Node {
|
|
int k;
|
|
int v;
|
|
Node* prev;
|
|
Node* next;
|
|
|
|
Node()
|
|
: k(0)
|
|
, v(0)
|
|
, prev(nullptr)
|
|
, next(nullptr) {}
|
|
Node(int key, int val)
|
|
: k(key)
|
|
, v(val)
|
|
, prev(nullptr)
|
|
, next(nullptr) {}
|
|
};
|
|
|
|
class LRUCache {
|
|
public:
|
|
LRUCache(int capacity)
|
|
: cap(capacity)
|
|
, size(0) {
|
|
head = new Node();
|
|
tail = new Node();
|
|
head->next = tail;
|
|
tail->prev = head;
|
|
}
|
|
|
|
int get(int key) {
|
|
if (!cache.count(key)) return -1;
|
|
Node* node = cache[key];
|
|
moveToHead(node);
|
|
return node->v;
|
|
}
|
|
|
|
void put(int key, int value) {
|
|
if (cache.count(key)) {
|
|
Node* node = cache[key];
|
|
node->v = value;
|
|
moveToHead(node);
|
|
} else {
|
|
Node* node = new Node(key, value);
|
|
cache[key] = node;
|
|
addToHead(node);
|
|
++size;
|
|
if (size > cap) {
|
|
node = removeTail();
|
|
cache.erase(node->k);
|
|
--size;
|
|
}
|
|
}
|
|
}
|
|
|
|
private:
|
|
unordered_map<int, Node*> cache;
|
|
Node* head;
|
|
Node* tail;
|
|
int cap;
|
|
int size;
|
|
|
|
void moveToHead(Node* node) {
|
|
removeNode(node);
|
|
addToHead(node);
|
|
}
|
|
|
|
void removeNode(Node* node) {
|
|
node->prev->next = node->next;
|
|
node->next->prev = node->prev;
|
|
}
|
|
|
|
void addToHead(Node* node) {
|
|
node->next = head->next;
|
|
node->prev = head;
|
|
head->next = node;
|
|
node->next->prev = node;
|
|
}
|
|
|
|
Node* removeTail() {
|
|
Node* node = tail->prev;
|
|
removeNode(node);
|
|
return node;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 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);
|
|
*/ |