@@ -5,34 +5,10 @@ def __init__(self, key, value):
55 self .next = None
66 self .previous = None
77
8- class LruCache :
9- def __init__ (self , limit : int ):
10- if limit <= 0 :
11- raise ValueError ("limit must be > 0" )
12-
8+ class List :
9+ def __init__ (self ):
1310 self .head = None
1411 self .tail = None
15- self .limit = limit
16- self .dict = {}
17-
18- def set (self , key , value ):
19- node = Node (key , value )
20-
21- self .dict [key ] = node
22- self .add_to_head (node )
23-
24- if len (self .dict ) > self .limit :
25- self .evict_tail ()
26-
27-
28- def get (self , key ):
29- node = self .dict .get (key )
30-
31- if node is None :
32- return None
33- else :
34- self .move_to_head (node )
35- return node .value
3612
3713 def add_to_head (self , node ):
3814 node .previous = None
@@ -64,10 +40,44 @@ def move_to_head(self, node):
6440 self .remove (node )
6541 self .add_to_head (node )
6642
67- def evict_tail (self ):
68- if self .tail is None :
43+ def pop_tail (self ):
44+ if not self .tail :
45+ return None
46+ old_tail = self .tail
47+ self .remove (old_tail )
48+ return old_tail
49+
50+ class LruCache :
51+ def __init__ (self , limit : int ):
52+ if limit <= 0 :
53+ raise ValueError ("limit must be > 0" )
54+
55+ self .limit = limit
56+ self .cache = {}
57+ self .list = List ()
58+
59+ def set (self , key , value ):
60+ node = self .cache .get (key )
61+
62+ if node :
63+ node .value = value
64+ self .list .move_to_head (node )
6965 return
66+
67+ node = Node (key , value )
68+ self .cache [key ] = node
69+ self .list .add_to_head (node )
7070
71- old_tail = self .tail
72- self .remove (old_tail )
73- del self .dict [old_tail .key ]
71+ if len (self .cache ) >= self .limit :
72+ tail = self .list .pop_tail ()
73+ if tail :
74+ del self .cache [tail .key ]
75+
76+ def get (self , key ):
77+ node = self .cache .get (key )
78+
79+ if node is None :
80+ return None
81+ else :
82+ self .list .move_to_head (node )
83+ return node .value
0 commit comments