1
-
2
-
3
1
class LRUCache :
4
2
def __init__ (self , maxSize ):
5
- self .cache = {}
6
3
self .maxSize = maxSize or 1
4
+ self .cache = {}
7
5
self .currentSize = 0
8
6
self .listOfMostRecent = DoublyLinkedList ()
9
7
10
-
11
- # O(1) time | O(1) space
12
8
def insertKeyValuePair (self , key , value ):
13
9
if key not in self .cache :
14
10
if self .currentSize == self .maxSize :
@@ -20,45 +16,32 @@ def insertKeyValuePair(self, key, value):
20
16
self .replaceKey (key , value )
21
17
self .updateMostRecent (self .cache [key ])
22
18
23
-
24
- # O(1) time | O(1) space
25
19
def getValueFromKey (self , key ):
26
20
if key not in self .cache :
27
21
return None
28
22
self .updateMostRecent (self .cache [key ])
29
23
return self .cache [key ].value
30
24
31
-
32
- # O(1) time | O(1) space
33
25
def getMostRecentKey (self ):
34
26
return self .listOfMostRecent .head .key
35
27
36
-
37
28
def evictLeastRecent (self ):
38
29
keyToRemove = self .listOfMostRecent .tail .key
39
30
self .listOfMostRecent .removeTail ()
40
31
del self .cache [keyToRemove ]
41
32
42
-
43
- def updateMostRecent (self , node ):
44
- self .listOfMostRecent .setToHead (node )
45
-
46
-
47
33
def replaceKey (self , key , value ):
48
- if key not in self .cache :
49
- raise Exception ("The provided key isn't in the cache!" )
50
34
self .cache [key ].value = value
51
35
52
-
53
-
36
+ def updateMostRecent ( self , listNode ):
37
+ self . listOfMostRecent . setHeadTo ( listNode )
54
38
55
39
class DoublyLinkedList :
56
40
def __init__ (self ):
57
41
self .head = None
58
42
self .tail = None
59
43
60
-
61
- def setToHead (self , node ):
44
+ def setHeadTo (self , node ):
62
45
if self .head == node :
63
46
return
64
47
elif self .head is None :
@@ -71,41 +54,35 @@ def setToHead(self, node):
71
54
else :
72
55
if self .tail == node :
73
56
self .removeTail ()
74
- node .removeBindings ()
57
+ node .removeBinding ()
75
58
self .head .prev = node
76
59
node .next = self .head
77
60
self .head = node
78
61
79
-
80
62
def removeTail (self ):
81
63
if self .tail is None :
82
64
return
83
- if self .tail == self .head :
65
+ if self .head == self .tail :
84
66
self .head = None
85
67
self .tail = None
86
68
return
87
69
self .tail = self .tail .prev
88
70
self .tail .next = None
89
71
90
-
91
72
class DoublyLinkedListNode :
92
- def __init__ (self , key , value ):
73
+ def __init__ (self , key , val ):
93
74
self .key = key
94
- self .value = value
95
- self .prev = None
75
+ self .value = val
96
76
self .next = None
77
+ self .prev = None
97
78
98
-
99
- def removeBindings (self ):
79
+ def removeBinding (self ):
100
80
if self .prev is not None :
101
81
self .prev .next = self .next
102
82
if self .next is not None :
103
83
self .next .prev = self .prev
104
- self .prev = None
105
84
self .next = None
106
-
107
-
108
-
85
+ self .prev = None
109
86
110
87
111
88
0 commit comments