Read-only web browser

Solutions

Browse the interview solutions folder with syntax highlighting.

lru-cache.py

linked-lists/lru-cache.py · Python · 1.5 KiB · 2026-02-21 15:49

Back to folder
# LRU Cache implementation using a doubly linked list and a hash map for O(1) access.
# linked-lists

class Node:
    def __init__(self, key: int, val: int):
        self.key, self.val = key, val
        self.next = self.prev = None

# O(1) time for get and put, O(capacity) space
class LRUCache:

    def __init__(self, capacity: int):
        self.capacity = capacity
        self.map : dict[int, Node] = {}
        self.head, self.tail = Node(0, 0), Node(0, 0)
        self.head.next = self.tail
        self.tail.prev = self.head
      
    def _delete(self, node: Node):
        """Delete a linked list node"""
        node.prev.next = node.next
        node.next.prev = node.prev
        del node # not really needed
        
    def _insert_in_front(self, node: Node):
        """Insert a node at the start of the linked list"""
        prev, nxt = self.head, self.head.next
        nxt.prev = prev.next = node
        node.prev, node.next = prev, nxt

    def get(self, key: int) -> int:
        if key not in self.map:
            return -1
        node = self.map[key]
        self._delete(node)
        self._insert_in_front(node)
        return node.val

    def put(self, key: int, value: int) -> None:
        if key in self.map:
            self._delete(self.map[key])
            del self.map[key]

        self.map[key] = Node(key, value)
        self._insert_in_front(self.map[key])

        if len(self.map) > self.capacity:
            lru = self.tail.prev
            self._delete(lru)
            del self.map[lru.key]