|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- class ListNode:
- def __init__(self,key=None,value=None):
- self.key = key
- self.value = value
- self.next = None
- self.pre = None
- class LRUCache:
- #'''使用双向链表进行操作'''#
- def __init__(self, capacity: int):
- self.capacity = capacity #链表节点总数
- self.hashmap = {} #哈希表存储节点的key值,用于指示节点
- self.head = ListNode() #定义头结点和尾节点
- self.tail = ListNode()
-
- self.head.next = self.tail #初始化链表,头尾结点相接
- self.tail.pre = self.head
-
- def move_to_tail(self,key:int):
- node = self.hashmap[key]
- node.pre.next = node.next#将需要移动到尾部的结点从链表中拎出(相当于在原位置删除)
- node.next.pre = node.pre
- node.pre = self.tail.pre#将该节点插入到尾节点前面一个位置
- node.next = self.tail
- self.tail.pre.next = node
- self.tail.pre = node
- def get(self, key: int) -> int:
- if key in self.hashmap:#defaultdict对于不存在的值返回空结点,dict对不存在的值会返回None
- self.move_to_tail(key) #把该被访问的结点移到链表尾部
- return self.hashmap[key].value
- else:
- return -1
- def put(self, key: int, value: int) -> None:
- if key in self.hashmap:#关键字key已存在于哈希表
- self.hashmap[key].value = value
- self.move_to_tail(key) #将更新后的key移动到链表尾部
- else:#哈希表不存在该关键字
- if len(self.hashmap) == self.capacity:#哈希表已达到最大容量
- self.hashmap.pop(self.head.next.key)
- self.head.next = self.head.next.next #头结点后删除该节点
- self.head.next.pre = self.head
- #新结点添加在tail节点之前
- new = ListNode()
- self.hashmap[new.key] = new
- new.pre = self.tail.pre#将该节点插入到尾节点前面一个位置
- new.next = self.tail
- self.tail.pre.next = new
- self.tail.pre = new
- # Your LRUCache object will be instantiated and called as such:
- # obj = LRUCache(capacity)
- # param_1 = obj.get(key)
- # obj.put(key,value)
复制代码
上述代码哪里有错?半天没看出来 |
|