Problem Link
class ListNode:
def __init__(self, key, value):
self.key = key
self.value = value
self.prev = self
self.next = self
class LRUCache:
def __init__(self, capacity: int):
self.d = dict()
self.dummy = ListNode(0, 0)
self.capacity = capacity
self.size = 0
def get(self, key: int) -> int:
if key in self.d:
node = self.d[key]
self.remove(node)
self.insertToHead(node)
return node.value
else:
return -1
def put(self, key: int, value: int) -> None:
if key in self.d:
node = self.d[key]
node.value = value
self.remove(node)
self.insertToHead(node)
else:
if self.size >= self.capacity:
self.removeTail()
self.size -= 1
node = ListNode(key, value)
self.insertToHead(node)
self.d[key] = node
self.size += 1
def remove(self, node) -> None:
node.prev.next = node.next
node.next.prev = node.prev
def insertToHead(self, node) -> None:
node.next = self.dummy.next
self.dummy.next.prev = node
self.dummy.next = node
node.prev = self.dummy
def removeTail(self) -> None:
tailNode = self.dummy.prev
del self.d[tailNode.key]
self.remove(tailNode)