class DLinkedList:
def __init__(self, key = 0, val = 0):
self.prev = None
self.next = None
self.val = val
self.key = key
class LRUCache:
def __init__(self, capacity: int):
self.head = DLinkedList()
self.tail = DLinkedList()
self.head.next = self.tail
self.tail.prev = self.head
self.cache = {}
self.capacity = capacity
def get(self, key: int) -> int:
if key in self.cache:
node = self.cache[key]
self.remove(node)
self.movetoHead(node)
return self.cache[key].val
return -1
def put(self, key: int, value: int) -> None:
if key in self.cache:
node = self.cache[key]
node.val = value
self.remove(node)
self.movetoHead(node)
else:
if self.capacity == 0:
del self.cache[self.tail.prev.key]
self.remove(self.tail.prev)
self.capacity += 1
node = DLinkedList(key,value)
self.cache[key] = node
self.capacity -= 1
self.movetoHead(node)
def movetoHead(self, node):
tmp = self.head.next
self.head.next = node
node.prev = self.head
node.next = tmp
tmp.prev = node
def remove(self, node):
prev = node.prev
next = node.next
prev.next = next
next.prev = prev
重点:
操作模块化(remove, movetoHead);
双向链表,链表内保存key - value;
虚拟头尾节点。