class Node:
    def __init__(self,key ,value):
        self.pre = None
        self.next = None
        self.key = key
        self.val = value

class Solution:
    def __init__(self, capacity: int):
        # 构建双向链表
        self.size = 0
        self.maxsize = capacity
        self.head = None
        # 记录key
        self.mp =dict()
    # 定义一个遍历 链表的函数
    def broad_node(self,head :Node):
        cur = head
        while cur is not None:
            print(f'key:{cur.key},value:{cur.val}')
            cur = cur.next

    # 指定节点移到表头的操作
    def move_head(self,node):
        cur = self.head
        while cur is not None :
            if cur.key == node.key :
                #找到此节点,断开,需要注意特殊情况,如果是表头不用动
                if cur == self.head :
                    return
                cur.pre.next = cur.next
                if cur.next :
                    cur.next.pre = cur.pre
                # 把该节点加到表头
                node.next = self.head
                self.head.pre = node
                self.head = node
            cur = cur.next
        return

    # 定义一个删除尾节点 函数 ,这个函数相对于删除指定节点要简单很多
    def del_tail(self):
        #找到尾节点
        cur = self.head
        while cur.next is not None :
            cur = cur.next
        # 如果这个限制长度是1 ,那直接初始化头结点即可
        if cur == self.head :
            self.head = None
        else :
            cur.pre.next = None
        # 哈希表 里面也别忘了删除键值对
        self.mp.pop(cur.key)

    # 定义一个插入节点函数
    def insert_node(self ,node):
        if self.head is None:
            self.head = node
        else:
            #插入表头 这个项目只需要插入表头即可
            node.next = self.head
            self.head.pre = node
            self.head = node
        # 哈市表也别忘了添加
        self.mp[node.key] = node.val

    def get(self, key: int) -> int:
        if key in self.mp.keys() :
            node_tem =Node(key,self.mp[key])
            self.move_head(node_tem)
            return self.mp[key]
        else:
            return -1

    def set(self, key: int, value: int) -> None:
        if key in self.mp.keys() :
            self.mp[key] = value
            node_tem = Node(key ,value)
            self.move_head(node_tem)
        else:
            #这种情况要判断长度是否超过了
            if self.size >= self.maxsize :
                self.del_tail()
                self.size -= 1
            node = Node(key, value)
            self.insert_node(node)
            self.size += 1