class Node: def __init__(self, key, val): self.key = key self.val = val self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): self.cap = capacity self.cache = {} self.left = Node(0, 0) self.right = Node(0, 0) self.left.next = self.right self.right.prev = self.left def remove(self, node): p, n = node.prev, node.next p.next = n n.prev = p def insert(self, node): p, n = self.right.prev, self.right p.next = node node.prev = p node.next = n n.prev = node def get(self, key: int) -> int: if key not in self.cache: return -1 node = self.cache[key] self.remove(node) self.insert(node) return node.val def put(self, key: int, value: int) -> None: if key in self.cache: self.remove(self.cache[key]) node = Node(key, value) self.cache[key] = node self.insert(node) if len(self.cache) > self.cap: lru = self.left.next self.remove(lru) del self.cache[lru.key] if __name__ == "__main__": lru = LRUCache(2) lru.put(1, 1) lru.put(2, 2) print(lru.get(1)) lru.put(3, 3) print(lru.get(2)) lru.put(4, 4) print(lru.get(1)) print(lru.get(3)) print(lru.get(4))