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)
12-27
09-27
572