https://leetcode-cn.com/problems/lru-cache/

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
struct node {
int key, value;
node * next;
node * pre;
node (int k, int v) {
key = k;
value = v;
next = pre = NULL;
}
node () {
key = value = 0;
next = pre = NULL;
}
};

class LRUCache {
unordered_map<int, node *>mp;
node * head;
node * tail;
int size;
int capacity;
public:
LRUCache(int _capacity) {
capacity = _capacity;
size = 0;
head = new node();
tail = new node();
head -> next = tail;
tail -> pre = head;
}

int get(int key) {
if(!mp.count(key)) {
return -1;
}
node * p = mp[key];
node * tmp1 = p -> pre;
node * tmp2 = p -> next;
tmp1 -> next = tmp2;
tmp2 -> pre = tmp1;

node * tmp3 = tail -> pre;
tmp3 -> next = p;
p -> next = tail;
tail -> pre = p;
p -> pre = tmp3;

return p -> value;
}

void put(int key, int value) {
if(!mp.count(key)) {
node * tmp = new node(key, value);
mp[key] = tmp;
size++;

node * tmp2 = tail -> pre;
tmp2 -> next = tmp;
tmp -> next = tail;
tail -> pre = tmp;
tmp -> pre = tmp2;
if(size > capacity) {
node * p = head -> next;
head -> next = p -> next;
p -> next -> pre = head;
mp.erase(p -> key);
delete p;
size--;
}
} else {
node * p = mp[key];
p -> value = value;
node * tmp1 = p -> pre;
node * tmp2 = p -> next;
tmp1 -> next = tmp2;
tmp2 -> pre = tmp1;

node * tmp3 = tail -> pre;
tmp3 -> next = p;
p -> next = tail;
tail -> pre = p;
p -> pre = tmp3;
}
}
};

/**
* 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);
*/