1+ class LruCache :
2+ def __init__ (self , limit ):
3+ if limit <= 0 :
4+ raise ValueError ("limit must be greater than 0" )
5+ self .limit = limit
6+ self .keys = {}
7+ self .linkedList = LinkedList ()
8+
9+ def get (self , key ):
10+ if key not in self .keys :
11+ return None
12+ else :
13+ self .linkedList .remove (self .keys [key ])
14+ self .linkedList .push_head (self .keys [key ])
15+ return self .keys [key ].data
16+
17+ def set (self , key , data ):
18+ if key not in self .keys :
19+ if len (self .keys ) >= self .limit :
20+ node_to_delete = self .linkedList .pop_tail ()
21+ del self .keys [node_to_delete .key ]
22+ self .keys [key ] = Node (key , data )
23+ self .linkedList .push_head (self .keys [key ])
24+
25+ else :
26+ self .keys [key ].data = data
27+ self .linkedList .push_head (self .keys [key ])
28+
29+ class Node :
30+ def __init__ (self , key , data ):
31+ self .key = key
32+ self .data = data
33+ self .next = None
34+ self .previous = None
35+
36+
37+ class LinkedList :
38+ def __init__ (self ):
39+ self .head = None
40+ self .tail = None
41+
42+ def push_head (self , new_node ):
43+ new_node .previous = None
44+ new_node .next = None
45+ if self .head is None :
46+ self .head = new_node
47+ self .tail = new_node
48+ else :
49+ new_node .next = self .head
50+ self .head .previous = new_node
51+ self .head = new_node
52+ return new_node
53+
54+ def remove (self , node ):
55+ if node is None :
56+ return
57+ if node == self .head :
58+ self .head = node .next
59+ if node == self .tail :
60+ self .tail = node .previous
61+ if node .previous is not None :
62+ node .previous .next = node .next
63+ if node .next is not None :
64+ node .next .previous = node .previous
65+ node .next = None
66+ node .previous = None
67+
68+ def pop_tail (self ):
69+ if self .tail is None :
70+ return None
71+ node_to_pop = self .tail
72+ self .remove (self .tail )
73+ return node_to_pop
0 commit comments