146. LRU Cache [Medium] 链表LRU
2019-10-10 本文已影响0人
一个想当大佬的菜鸡

class Node(object):
def __init__(self, key, val):
self.key = key
self.val = val
self.prev = None
self.next = None
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.head = Node(None, None)
self.tail = Node(None, None)
self.size = 0
self.capacity = capacity
self.head.next = self.tail
self.tail.prev = self.head
self.position = {}
self.record = {}
def updateOrder(self, node):
node.prev.next = node.next
node.next.prev = node.prev
node.prev = self.tail.prev
self.tail.prev.next = node
node.next = self.tail
self.tail.prev = node
return node
def get(self, key):
"""
:type key: int
:rtype: int
"""
if key in self.record:
self.position[key] = self.updateOrder(self.position[key])
return self.record[key]
else:
return -1
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: None
"""
if key in self.record:
self.record[key] = value
node = self.position[key]
node = self.updateOrder(node)
node.val = value
else:
if self.size == self.capacity:
self.size -= 1
del self.position[self.head.next.key]
del self.record[self.head.next.key]
self.head.next = self.head.next.next
self.head.next.prev = self.head
self.size += 1
node = Node(key, value)
self.tail.prev.next = node
node.prev = self.tail.prev
node.next = self.tail
self.tail.prev = node
self.record[key] = value
self.position[key] = node