题解 | #设计LRU缓存结构#

设计LRU缓存结构

https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84

class Node:  
    def __init__(self, key, value):  
        self.key = key  # 节点的键  
        self.value = value  # 节点的值  
        self.prev = None  # 指向前一个节点的指针  
        self.next = None  # 指向后一个节点的指针  
  
  
class Solution:  
    def __init__(self, capacity: int):  
        self.capacity = capacity  # 缓存的最大容量  
        self.cache = {}  # 哈希表,用于存储键到节点的映射  
        # 初始化双向链表的头尾节点,它们不存储实际数据  
        self.head = Node(0, 0)  
        self.tail = Node(0, 0)  
        self.head.next = self.tail  # 头节点指向尾节点  
        self.tail.prev = self.head  # 尾节点指回头节点  
  
    def get(self, key: int) -> int:  
        if key in self.cache:  
            node = self.cache[key]  # 从哈希表中获取节点  
            self._move_to_head(node)  # 将节点移动到双向链表的头部  
            return node.value  # 返回节点的值  
        return -1  # 如果键不存在,则返回-1  
  
    def set(self, key: int, value: int) -> None:  
        if key in self.cache:  
            node = self.cache[key]  # 从哈希表中获取节点  
            node.value = value  # 更新节点的值  
            self._move_to_head(node)  # 将节点移动到双向链表的头部  
        else:  
            if len(self.cache) == self.capacity:  
                self._remove_tail()  # 如果缓存已满,则移除双向链表的尾部节点  
            node = Node(key, value)  # 创建一个新的节点  
            self.cache[key] = node  # 将节点添加到哈希表中  
            self._add_to_head(node)  # 将节点添加到双向链表的头部  
  
    def _move_to_head(self, node):  
        self._remove_node(node)  # 从双向链表中移除节点  
        self._add_to_head(node)  # 将节点添加到双向链表的头部  
  
    def _remove_node(self, node):  
        prev = node.prev  # 获取节点的前一个节点  
        next = node.next  # 获取节点的后一个节点  
        prev.next = next  # 将前一个节点的next指针指向后一个节点  
        next.prev = prev  # 将后一个节点的prev指针指向前一个节点  
  
    def _add_to_head(self, node):  
        node.prev = self.head  # 将节点的prev指针指向头节点  
        node.next = self.head.next  # 将节点的next指针指向头节点的下一个节点  
        self.head.next.prev = node  # 将头节点的下一个节点的prev指针指向新节点  
        self.head.next = node  # 将头节点的next指针指向新节点  
  
    def _remove_tail(self):  
        tail = self.tail.prev  # 获取尾节点的前一个节点,即要移除的节点  
        self._remove_node(tail)  # 从双向链表中移除该节点  
        del self.cache[tail.key]  # 从哈希表中删除该节点的键

全部评论

相关推荐

11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务