146.LRU缓存

class DoubleLinkNode():
    def __init__(self, key=0, val=0):
        self.key = key    # 表示节点的key
        self.val = val  # 表示节点的value
        self.prev = None 
        self.next = None 

class LRUCache:

    def __init__(self, capacity: int):
        # 字典里面的键就是key,值就是对应的node                                                                                                                                                                    
        self.cache = dict()
        # 使用伪头结点和伪尾结点,方便进行前移和删除
        self.capacity = capacity   # 双向链表的最大长度
        self.size = 0   # 表示双向链表的真实长度
        self.head = DoubleLinkNode()
        self.tail = DoubleLinkNode()
        self.head.next = self.tail
        self.tail.prev = self.head

    def get(self, key: int) -> int:
        # 先检查key是否在cache中
        # 如果不在cache中,就返回-1
        if key not in self.cache:
            return -1
            
        # 如果在cache中,就把此node调到链表头部,并返回value
        node = self.cache[key]
        self.moveToHead(node)
        return node.val 



    def put(self, key: int, value: int) -> None:
        # 如果key不在cache里面
        if key not in self.cache:
            # 创建一个新节点
            node = DoubleLinkNode(key, value)
            self.size += 1
            # 加入到hash表中
            self.cache[key] = node 
            # 添加到链表的头部
            self.addToHead(node)

            if self.size > self.capacity:
                # 如果超出容量,则删除尾部的node
                removedNode = self.removeTail()
                # 删除其在cache中的键值对
                self.cache.pop(removedNode.key)
                # 记得把链表的真实长度也记得修改
                self.size -= 1
        else:
            # 如果key在cache里面,修改key对应的value 
            node = self.cache[key]
            node.val = value 
            # 并把它移动到头部
            self.moveToHead(node)

    def addToHead(self, node):
        self.head.next.prev = node 
        node.next = self.head.next
        self.head.next = node 
        node.prev = self.head
    
    def removeNode(self, node):
        node.prev.next = node.next
        node.next.prev = node.prev

    def moveToHead(self, node):
        # 先把node删除掉
        self.removeNode(node)
        # 再把node加到head后面
        self.addToHead(node)

    def removeTail(self):
        # 删除尾部的node
        node = self.tail.prev 
        self.removeNode(node)
        return node
        # self.tail.prev.prev.next = self.tail 
        # self.tail.prev = self.tail.prev.prev


# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值