解题思路:使用双向链表存储key代表的node。每次访问或添加时,都将该key对应的node置于头部。若长度超过最大限度,则删除尾部的节点。
class Node(object):
def __init__(self, key, value):
self.key = key
self.val = value
self.pre = None
self.next = None
class DoubleLinkedList(object):
def __init__(self):
self.head = None
self.tail = None
def addHead(self, Node):
if self.head is not None:
self.head.pre = Node
Node.next = self.head
Node.pre = None
self.head = Node
else:
self.head = Node
self.tail = Node
def removeTail(self):
key = None
if self.tail:
key = self.tail.key
if self.tail and self.tail.pre:
self.tail.pre.next = None
self.tail = self.tail.pre
else:
self.tail = None
self.head = None
return key
def remove(self, Node):
if Node == self.head:
self.head = Node.next
if self.head:
self.head.pre = None
if Node == self.tail:
self.removeTail()
if Node.pre:
Node.pre.next = Node.next
if Node.next:
Node.next.pre = Node.pre
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.capacity = capacity
self.now = 0
self.list = DoubleLinkedList()
self.dict = {}
def get(self, key):
"""
:type key: int
:rtype: int
"""
if key in self.dict:
node = self.dict[key]
self.list.remove(node)
self.list.addHead(node)
return node.val
else:
return -1
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
if key in self.dict:
node = self.dict[key]
node.val = value
self.list.remove(node)
self.list.addHead(node)
else:
node = Node(key,value)
self.dict[key] = node
self.list.addHead(node)
self.now += 1
if self.now > self.capacity:
key = self.list.removeTail()
self.now -= 1
self.dict.pop(key)
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)