-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathLRUCache.cpp
102 lines (87 loc) · 2.17 KB
/
LRUCache.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <unordered_map>
using namespace std;
/**
* 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);
*/
// Problem: https://leetcode.com/problems/lru-cache/
struct Node {
Node(): right(nullptr), left(nullptr), key(-1), value(-1) {}
Node* right;
Node* left;
int key;
int value;
};
class LRUCache {
public:
LRUCache(int capacity) {
max_size = capacity;
head = new Node();
tail = new Node();
head->right = tail;
tail->left = head;
}
void put(int key, int value) {
Node* node_value = nullptr;
// Step-I: Check if the key exists in the map.
if (node_map.find(key) != node_map.end()) {
// Step-II: If exists, update node; push to front.
node_value = node_map[key];
node_value->value = value;
node_map[key] = node_value;
removeNode(node_value);
} else {
// Step-III: If not exists, create node, push to front.
node_value = new Node();
node_value->key = key;
node_value->value = value;
node_map[key] = node_value;
}
insertNodeFront(node_value);
// Step-IV: Check if need to evict. If yes, delete the last node.
if (node_map.size() > max_size) {
Node* delete_node = deleteFromBack();
node_map.erase(delete_node->key);
delete delete_node;
}
}
int get(int key) {
// Step-I: Check if the key exists in the map.
if (node_map.find(key) == node_map.end()) return -1;
// Step-II: If exists, push to front, return value;
Node* node_value = node_map[key];
removeNode(node_value);
insertNodeFront(node_value);
return node_value->value;
}
private:
void removeNode(Node* node) {
Node* p = node->left;
Node* n = node->right;
p->right = n;
n->left = p;
node->left = nullptr;
node->right = nullptr;
}
void insertNodeFront(Node* node) {
Node* tmp = head->right;
head->right = node;
node->right = tmp;
node->left = head;
tmp->left = node;
}
Node* deleteFromBack() {
Node* back = tail->left;
tail->left = back->left;
tail->left->right = tail;
back->right = nullptr;
back->left = nullptr;
return back;
}
unordered_map<int, Node*> node_map;
Node* head;
Node* tail;
int max_size;
};