File tree Expand file tree Collapse file tree 1 file changed +70
-0
lines changed
Sprint-2/implement_lru_cache Expand file tree Collapse file tree 1 file changed +70
-0
lines changed Original file line number Diff line number Diff line change 1+ class Node :
2+ def __init__ (self , key , value ):
3+ self .key = key
4+ self .value = value
5+ self .previous = None
6+ self .next = None
7+
8+
9+ class LruCache :
10+ def __init__ (self , limit ):
11+ if limit <= 0 :
12+ raise ValueError ("Limit must be greater than 0" )
13+
14+ self .limit = limit
15+ self .cache = {}
16+ self .head = None
17+ self .tail = None
18+
19+ def _remove (self , node ):
20+ if node .previous :
21+ node .previous .next = node .next
22+ else :
23+ self .head = node .next
24+
25+ if node .next :
26+ node .next .previous = node .previous
27+ else :
28+ self .tail = node .previous
29+
30+ node .previous = None
31+ node .next = None
32+
33+ def _add_to_head (self , node ):
34+ node .next = self .head
35+ node .previous = None
36+
37+ if self .head :
38+ self .head .previous = node
39+ else :
40+ self .tail = node
41+
42+ self .head = node
43+
44+ def get (self , key ):
45+ if key not in self .cache :
46+ return None
47+
48+ node = self .cache [key ]
49+ self ._remove (node )
50+ self ._add_to_head (node )
51+
52+ return node .value
53+
54+ def set (self , key , value ):
55+ if key in self .cache :
56+ node = self .cache [key ]
57+ node .value = value
58+ self ._remove (node )
59+ self ._add_to_head (node )
60+ return
61+
62+ if len (self .cache ) >= self .limit :
63+ lru = self .tail
64+ if lru :
65+ self ._remove (lru )
66+ del self .cache [lru .key ]
67+
68+ new_node = Node (key , value )
69+ self ._add_to_head (new_node )
70+ self .cache [key ] = new_node
You can’t perform that action at this time.
0 commit comments