CODE-0003 · glm-5.2 (default)
class LRUCache:
    def __init__(self, capacity):
        self.capacity = capacity
        self._cache = {}
        self._head = {"prev": None, "next": None, "key": None, "value": None}
        self._tail = {"prev": None, "next": None, "key": None, "value": None}
        self._head["next"] = self._tail
        self._tail["prev"] = self._head

    def _remove(self, node):
        prev_node = node["prev"]
        next_node = node["next"]
        prev_node["next"] = next_node
        next_node["prev"] = prev_node

    def _add_front(self, node):
        node["prev"] = self._head
        node["next"] = self._head["next"]
        self._head["next"]["prev"] = node
        self._head["next"] = node

    def get(self, key):
        if key not in self._cache:
            return -1
        node = self._cache[key]
        self._remove(node)
        self._add_front(node)
        return node["value"]

    def put(self, key, value):
        if self.capacity == 0:
            return
        if key in self._cache:
            node = self._cache[key]
            node["value"] = value
            self._remove(node)
            self._add_front(node)
        else:
            if len(self._cache) >= self.capacity:
                lru = self._tail["prev"]
                self._remove(lru)
                del self._cache[lru["key"]]
            node = {"prev": None, "next": None, "key": key, "value": value}
            self._cache[key] = node
            self._add_front(node)