1
+ #include < iostream>
2
+ #include < vector>
3
+ #include < unordered_map>
4
+
5
+ using namespace std ;
6
+
7
+ class LRUCache
8
+ {
9
+ public:
10
+ class Node // structure of doubly linked-list
11
+ {
12
+ public:
13
+ int key, val;
14
+ Node *prev, *next;
15
+
16
+ Node (int k, int v) // node initialiser
17
+ {
18
+ key = k;
19
+ val = v;
20
+ prev = next = nullptr ;
21
+ }
22
+ };
23
+
24
+ // dummy head and tail
25
+ Node *head = new Node(-1 , -1 );
26
+ Node *tail = new Node(-1 , -1 );
27
+
28
+ unordered_map<int , Node *> m;
29
+ int limit; // limit or capacity of cache
30
+
31
+ LRUCache (int capacity)
32
+ {
33
+ limit = capacity;
34
+ head->next = tail;
35
+ tail->prev = head;
36
+ }
37
+
38
+ void addNode (Node *newNode) // to add node
39
+ {
40
+ Node *temp = head->next ;
41
+
42
+ head->next = newNode;
43
+ newNode->prev = head;
44
+ newNode->next = temp;
45
+ temp->prev = newNode;
46
+ }
47
+
48
+ void delNode (Node *oldNode) // to delete node
49
+ {
50
+ Node *prevNode = oldNode->prev ;
51
+ Node *nextNode = oldNode->next ;
52
+
53
+ prevNode->next = nextNode;
54
+ nextNode->prev = prevNode;
55
+ }
56
+
57
+ int get (int key)
58
+ {
59
+ if (m.find (key) == m.end ()) // if key is not present
60
+ {
61
+ return -1 ;
62
+ }
63
+
64
+ Node *ansNode = m[key];
65
+ int ans = ansNode->val ;
66
+ m.erase (key);
67
+
68
+ delNode (ansNode);
69
+ addNode (ansNode);
70
+ m[key] = ansNode;
71
+
72
+ return ans;
73
+ }
74
+
75
+ void put (int key, int value)
76
+ {
77
+ if (m.find (key) != m.end ())
78
+ {
79
+ Node *existingNode = m[key];
80
+ delNode (existingNode);
81
+ m.erase (key);
82
+ }
83
+
84
+ if (m.size () == limit)
85
+ {
86
+ m.erase (tail->prev ->key );
87
+ delNode (tail->prev );
88
+ }
89
+
90
+ Node *newNode = new Node (key, value);
91
+ addNode (newNode);
92
+ m[key] = newNode;
93
+ }
94
+ };
95
+
96
+ int main ()
97
+ {
98
+ LRUCache cache (2 );
99
+
100
+ cache.put (1 , 1 );
101
+ cache.put (2 , 2 );
102
+ cout << cache.get (1 ) << endl; // returns 1
103
+
104
+ cache.put (3 , 3 ); // evicts key 2
105
+ cout << cache.get (2 ) << endl; // returns -1 (not found)
106
+
107
+ cache.put (4 , 4 ); // evicts key 1
108
+ cout << cache.get (1 ) << endl; // returns -1 (not found)
109
+ cout << cache.get (3 ) << endl; // returns 3
110
+ cout << cache.get (4 ) << endl; // returns 4
111
+
112
+ return 0 ;
113
+ }
0 commit comments