1+ '''
2+ if an item needs to be evicted, the item which was least recently used will be evicted.
3+ Both setting or getting a value counts as a use.
4+ It should support the following operations. Each operation should have a O(1) worst-case time complexity.
5+ * `LruCache(limit)` should construct an LRU cache which never stores more than `limit` entries.
6+ * `set(key, value)` should associate `value` with the passed `key`.
7+ * `get(key)` should look-up the value previously associated with `key`.
8+ '''
9+
10+ class Node :
11+ def __init__ (self , key , value ):
12+ self .key = key # store the key
13+ self .value = value # store the value
14+ self .prev = None # previous node in list
15+ self .next = None # next node in list
16+
17+
18+ class LruCache :
19+ def __init__ (self , limit ):
20+
21+ self .limit = limit
22+ self .data = {}
23+ self .first = None
24+ self .last = None
25+
26+ def set (self , key , value ):
27+
28+ if key in self .data :
29+ node = self .data [key ]
30+ node .value = value
31+
32+ # when node is used, is move to front
33+ if node != self .first :
34+
35+ if node .prev :
36+ node .prev .next = node .next
37+ if node .next :
38+ node .next .prev = node .prev
39+
40+ if node == self .last :
41+ self .last = node .prev
42+
43+ node .prev = None
44+ node .next = self .first
45+ self .first .prev = node
46+ self .first = node
47+
48+ return
49+
50+ # create new node when key doesn't exit
51+ node = Node (key , value )
52+ self .data [key ] = node
53+
54+ node .next = self .first
55+ if self .first :
56+ self .first .prev = node
57+ self .first = node
58+
59+ if self .last is None :
60+ self .last = node
61+
62+ # remove last when size is bigger than limit
63+ if len (self .data ) > self .limit :
64+ old = self .last
65+
66+ del self .data [old .key ]
67+
68+ self .last = old .prev
69+ if self .last :
70+ self .last .next = None
71+
72+ def get (self , key ):
73+
74+ if key not in self .data :
75+ return None
76+
77+ node = self .data [key ]
78+
79+ # moving node to front because was used
80+ if node != self .first :
81+
82+ if node .prev :
83+ node .prev .next = node .next
84+ if node .next :
85+ node .next .prev = node .prev
86+
87+ if node == self .last :
88+ self .last = node .prev
89+
90+ node .prev = None
91+ node .next = self .first
92+ self .first .prev = node
93+ self .first = node
94+
95+ return node .value
0 commit comments