@@ -132,3 +132,83 @@ def test():
132
132
133
133
if __name__ == '__main__' :
134
134
test ()
135
+
136
+
137
+ ######################################### 使用双链表实现 LRUcache ####################################################
138
+ """
139
+ 一般面试中不会让我们直接用内置结构,所以这里提供一个自己实现的双链表+map lru 缓存。这也是力扣上的一道真题:
140
+ [146] LRU 缓存 https://leetcode-cn.com/problems/lru-cache/description/
141
+ """
142
+
143
+ class ListNode :
144
+ def __init__ (self , key = None , value = None ):
145
+ self .key = key
146
+ self .value = value
147
+ self .prev = self .next = None
148
+
149
+
150
+ class List :
151
+ def __init__ (self ):
152
+ """循环双链表。注意增加了虚拟头尾结点 head,tail 方便处理"""
153
+ self .head = ListNode ()
154
+ self .tail = ListNode ()
155
+ self .head .prev = self .head .next = self .tail
156
+ self .tail .next = self .tail .prev = self .head
157
+
158
+ def delete_node (self , node ): # 删除指定节点
159
+ node .prev .next = node .next
160
+ node .next .prev = node .prev
161
+
162
+ def add_to_head (self , node ): # 指定节点添加到 self.head 后
163
+ nextnode = self .head .next
164
+ node .next = nextnode
165
+ node .prev = self .head
166
+ self .head .next = node
167
+ nextnode .prev = node
168
+
169
+
170
+ class LRUCache (object ):
171
+
172
+ def __init__ (self , capacity ):
173
+ """
174
+ 思路:循环双链表 + 字典
175
+ :type capacity: int
176
+ """
177
+ self .map = dict ()
178
+ self .ll = List ()
179
+ self .capacity = capacity
180
+
181
+ def get (self , key ):
182
+ """
183
+ :type key: int
184
+ :rtype: int
185
+ """
186
+ if key not in self .map :
187
+ return - 1
188
+
189
+ node = self .map [key ]
190
+ self .ll .delete_node (node )
191
+ self .ll .add_to_head (node )
192
+ return node .value
193
+
194
+ def put (self , key , value ):
195
+ """
196
+ :type key: int
197
+ :type value: int
198
+ :rtype: None
199
+ """
200
+ if key in self .map :
201
+ node = self .map [key ]
202
+ node .value = value # 修改结构体会也会修改 map 对应 value 的引用
203
+ self .ll .delete_node (node )
204
+ self .ll .add_to_head (node )
205
+ else :
206
+ if len (self .map ) >= self .capacity : # 直接用 len(self.map) ,不需要self.size 字段了
207
+ tailnode = self .ll .tail .prev
208
+ self .ll .delete_node (tailnode )
209
+ del self .map [tailnode .key ]
210
+
211
+ node = ListNode (key , value )
212
+ self .map [key ] = node
213
+ self .ll .add_to_head (node )
214
+
0 commit comments