@@ -52,10 +52,11 @@ class LFUCache {
5252 delete chain;
5353 }
5454
55- Chain* removeNode (int key) {
55+ void removeNode (int key) {
5656 Chain* chain = Map[key].first ;
5757 ListNode* node = Map[key].second ;
5858 Map.erase (key);
59+ 5960 if (node->prev ) {
6061 node->prev ->next = node->next ;
6162 } else {
@@ -67,12 +68,13 @@ class LFUCache {
6768 chain->tail = node->prev ;
6869 }
6970 delete node;
70- 71- Chain* newChain = nullptr ;
71+ }
72+ 73+ Chain* updateChain (Chain* chain) {
7274 if (!chain->next or chain->next ->freq > chain->freq + 1 ) {
7375 chain->next = new Chain (chain);
7476 }
75- newChain = chain->next ;
77+ Chain* newChain = chain->next ;
7678
7779 if (!chain->head and !chain->tail ) {
7880 removeChain (chain);
@@ -81,9 +83,8 @@ class LFUCache {
8183 return newChain;
8284 }
8385
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};
8788 node->next = chain->head ;
8889 node->prev = nullptr ;
8990 if (chain->head ) {
@@ -104,7 +105,7 @@ class LFUCache {
104105
105106 LFUCache (int capacity) {
106107 this ->capacity = capacity;
107- head = nullptr ;
108+ head = new Chain () ;
108109 Map = unordered_map<int , pair<Chain*, ListNode*> >();
109110 currLen = 0 ;
110111 }
@@ -113,49 +114,47 @@ class LFUCache {
113114 if (Map.find (key) == Map.end ()) {
114115 return -1 ;
115116 }
117+ Chain* chain = Map[key].first ;
116118 ListNode* node = Map[key].second ;
117119 int value = node->value ;
118- Chain* newChain = removeNode (key);
120+ removeNode (key);
121+ Chain* newChain = updateChain (chain);
119122 ListNode* newNode = new ListNode (key, value);
120- Map[key] = {newChain, newNode};
121- setHead (key);
123+ setHead (newChain, newNode);
122124
123125 return value;
124126 }
125127
126- void set (int key, int value) {
128+ void put (int key, int value) {
127129
128130 if (capacity == 0 ) {
129131 return ;
130132 }
131133
134+ ListNode* newNode = new ListNode (key, value);
135+ 132136 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);
138141 return ;
139142 }
140143
141144 if (currLen == capacity) {
142145 Chain* chain = head;
143146 ListNode* node = chain->tail ;
144147 removeNode (node->key );
148+ updateChain (chain);
145149 currLen--;
146150 }
147- ListNode* newNode = new ListNode (key, value);
148- if (!head) {
149- head = new Chain ();
150- }
151151 if (head->freq > 0 ) {
152152 Chain* newHead = new Chain ();
153153 newHead->next = head;
154154 head->prev = newHead;
155155 head = newHead;
156156 }
157- Map[key] = {head, newNode};
158- setHead (key);
157+ setHead (head, newNode);
159158
160159 currLen++;
161160 }
0 commit comments