@@ -52,10 +52,11 @@ class LFUCache {
52
52
delete chain;
53
53
}
54
54
55
- Chain* removeNode (int key) {
55
+ void removeNode (int key) {
56
56
Chain* chain = Map[key].first ;
57
57
ListNode* node = Map[key].second ;
58
58
Map.erase (key);
59
+
59
60
if (node->prev ) {
60
61
node->prev ->next = node->next ;
61
62
} else {
@@ -67,12 +68,13 @@ class LFUCache {
67
68
chain->tail = node->prev ;
68
69
}
69
70
delete node;
70
-
71
- Chain* newChain = nullptr ;
71
+ }
72
+
73
+ Chain* updateChain (Chain* chain) {
72
74
if (!chain->next or chain->next ->freq > chain->freq + 1 ) {
73
75
chain->next = new Chain (chain);
74
76
}
75
- newChain = chain->next ;
77
+ Chain* newChain = chain->next ;
76
78
77
79
if (!chain->head and !chain->tail ) {
78
80
removeChain (chain);
@@ -81,9 +83,8 @@ class LFUCache {
81
83
return newChain;
82
84
}
83
85
84
- void setHead (int key) {
85
- Chain* chain = Map[key].first ;
86
- ListNode* node = Map[key].second ;
86
+ void setHead (Chain* chain, ListNode* node) {
87
+ Map[node->key ] = {chain, node};
87
88
node->next = chain->head ;
88
89
node->prev = nullptr ;
89
90
if (chain->head ) {
@@ -104,7 +105,7 @@ class LFUCache {
104
105
105
106
LFUCache (int capacity) {
106
107
this ->capacity = capacity;
107
- head = nullptr ;
108
+ head = new Chain () ;
108
109
Map = unordered_map<int , pair<Chain*, ListNode*> >();
109
110
currLen = 0 ;
110
111
}
@@ -113,49 +114,47 @@ class LFUCache {
113
114
if (Map.find (key) == Map.end ()) {
114
115
return -1 ;
115
116
}
117
+ Chain* chain = Map[key].first ;
116
118
ListNode* node = Map[key].second ;
117
119
int value = node->value ;
118
- Chain* newChain = removeNode (key);
120
+ removeNode (key);
121
+ Chain* newChain = updateChain (chain);
119
122
ListNode* newNode = new ListNode (key, value);
120
- Map[key] = {newChain, newNode};
121
- setHead (key);
123
+ setHead (newChain, newNode);
122
124
123
125
return value;
124
126
}
125
127
126
- void set (int key, int value) {
128
+ void put (int key, int value) {
127
129
128
130
if (capacity == 0 ) {
129
131
return ;
130
132
}
131
133
134
+ ListNode* newNode = new ListNode (key, value);
135
+
132
136
if (Map.find (key) != Map.end ()) {
133
- ListNode* node = Map[key].second ;
134
- Chain* newChain = removeNode (key);
135
- ListNode* newNode = new ListNode (key, value);
136
- Map[key] = {newChain, newNode};
137
- setHead (key);
137
+ Chain* chain = Map[key].first ;
138
+ removeNode (key);
139
+ Chain* newChain = updateChain (chain);
140
+ setHead (newChain, newNode);
138
141
return ;
139
142
}
140
143
141
144
if (currLen == capacity) {
142
145
Chain* chain = head;
143
146
ListNode* node = chain->tail ;
144
147
removeNode (node->key );
148
+ updateChain (chain);
145
149
currLen--;
146
150
}
147
- ListNode* newNode = new ListNode (key, value);
148
- if (!head) {
149
- head = new Chain ();
150
- }
151
151
if (head->freq > 0 ) {
152
152
Chain* newHead = new Chain ();
153
153
newHead->next = head;
154
154
head->prev = newHead;
155
155
head = newHead;
156
156
}
157
- Map[key] = {head, newNode};
158
- setHead (key);
157
+ setHead (head, newNode);
159
158
160
159
currLen++;
161
160
}
0 commit comments