通过双向链表和哈希表的结合实现LRU
class Node:
def __init__(self, key = 0, value=0):
self.key = key
self.value = value
self.next = None
self.pre = None
class Solution:
def __init__(self, max_size = 0):
self.dummy = Node()
self.tail = self.dummy
self.dic = {}
self.size = 0
self.max_size = max_size
def set(self, key, value):
if key not in self.dic:
node = Node(key, value)
self.size += 1 # 只有不存在的点才要+size
else:
node = self.dic[key]
node.value = value
if node.next == None:
return
pre = node.pre
nxt = node.next
pre.next = nxt
nxt.pre = pre # 一定要记得把下一个node的pre调好
node.next = None
node.pre = self.tail
self.tail.next = node
self.tail = self.tail.next
self.dic[key] = node
if self.size > self.max_size:
node = self.dummy.next
nxt = node.next
self.dummy.next = nxt
if nxt != None:
nxt.pre = self.dummy # 一定要记得把下一个node的pre调好
self.dic.pop(node.key)
# del self.dic[node.key]
self.size -= 1
def get(self, key):
if key not in self.dic:
return -1
node = self.dic[key]
if node.next == None: # 当查到的元素是最后一个的时候,不能使用下面的方法,因为node.pre = self.tail中node和tail是同一个元素
return node.value
pre = node.pre
nxt = node.next
pre.next = nxt
nxt.pre = pre # 一定要记得把下一个node的pre调好 'NoneType' object has no attribute 'pre'
node.pre = self.tail
node.next = None
self.tail.next = node
self.tail = self.tail.next
return node.value
def LRU(self , operators , k):
# write code here
self.max_size = k
rst = []
i = 0
for arr in operators:
if arr[0] == 1:
self.set(arr[1], arr[2])
elif arr[0] == 2:
rst.append(self.get(arr[1]))
# i+=1
# print(i, self.dic)
# cur = self.dummy.next
# tmp = []
# while cur != None:
# print('/*-', end='')
# tmp.append(cur.key)
# cur = cur.next
# print(tmp)
# cur = self.tail
# tmp2 = []
# while cur != self.dummy:
# print('/*-', end='')
# tmp2.append(cur.key)
# cur = cur.pre
# print(tmp2)
return rst