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