1- class Node :
2- def __init__ (self , key , value ):
3- self .key = key
4- self .value = value
5- self .next = None
6- self .previous = None
1+ from linked_list import LinkedList
2+
73
84class LruCache :
95 def __init__ (self , limit ):
106 if limit <= 0 :
11- raise ValueError
7+ raise ValueError ( "Limit must be greater than zero" )
128
139 self .limit = limit
1410 self .cache = {}
15- self .head = None
16- self .tail = None
17-
18- def _remove_node (self , node ):
19- if node .previous is not None :
20- node .previous .next = node .next
21- else :
22- self .head = node .next
23-
24- if node .next is not None :
25- node .next .previous = node .previous
26- else :
27- self .tail = node .previous
28-
29- def _add_to_tail (self , node ):
30- node .next = None
31- node .previous = self .tail
32-
33- if self .tail is not None :
34- self .tail .next = node
35- else :
36- self .head = node
37-
38- self .tail = node
11+ self .order = LinkedList ()
3912
4013 def get (self , key ):
4114 if key not in self .cache :
4215 return None
4316
4417 node = self .cache [key ]
18+ value = node .value [1 ]
4519
46- # Move node to the most-recently-used position
47- if node is not self .tail :
48- self ._remove_node (node )
49- self ._add_to_tail ( node )
20+ # Move the accessed item to the head.
21+ self .order . remove ( node )
22+ new_node = self .order . push_head (node . value )
23+ self .cache [ key ] = new_node
5024
51- return node . value
25+ return value
5226
5327 def set (self , key , value ):
5428 if key in self .cache :
5529 node = self .cache [key ]
56- node .value = value
57-
58- # Updating an item counts as using it
59- if node is not self .tail :
60- self ._remove_node (node )
61- self ._add_to_tail (node )
62-
63- return
64-
65- node = Node (key , value )
66- self .cache [key ] = node
67- self ._add_to_tail (node )
30+ self .order .remove (node )
6831
69- if len (self .cache ) > self .limit :
70- lru_node = self .head
32+ elif len (self .cache ) >= self .limit :
33+ # Remove the least recently used item.
34+ lru_item = self .order .pop_tail ()
35+ del self .cache [lru_item [0 ]]
7136
72- self ._remove_node (lru_node )
73- del self .cache [lru_node .key ]
37+ # Add the item to the head as most recently used.
38+ node = self .order .push_head ((key , value ))
39+ self .cache [key ] = node
0 commit comments