/*
put
if(key)
更新节点值
将节点移到链表的头部
else
if(缓存满了)
移出最后一个节点,删除它在哈希表中的映射
新建一个节点
在哈希表中增加映射
把节点加到链表头部
get
if(key)
返回节点值
将节点移到链表头部
else
return -1
*/
class DoubleLinkedListNode{
constructor(key,val){
this.key = key
this.val = val
this.prev = null
this.next = null
}
}
class LRUCache {
constructor(capacity){
this.capacity = capacity
this.hasmap = {}
this.dummyHead = new DoubleLinkedListNode(null,null)
this.dummyTail = new DoubleLinkedListNode(null,null)
this.dummyHead.next = this.dummyTail
this.dummyTail.prev = this.dummyHead
}
_isFull(){
return Object.keys(this.hasmap).length == this.capacity
}
_removeNode(node){
node.prev.next = node.next
node.next.prev = node.prev
node.prev = null
node.next = null
return node
}
_addToHead(node){
const head = this.dummyHead.next
node.next = head
head.prev = node
node.prev = this.dummyHead
this.dummyHead.next = node
}
get(key){
if(key in this.hasmap){
const node = this.hasmap[key]
this._addToHead(this._removeNode(node))
return node.val
}else{
return -1
}
}
put(key,value){
if(key in this.hasmap){
const node = this.hasmap[key]
node.val = value
this._addToHead(this._removeNode(node))
}else{
if(this._isFull()){
const node = this.dummyTail.prev
delete this.hasmap[node.key]
this._removeNode(node)
}
const node = new DoubleLinkedListNode(key,value)
this.hasmap[key] = node
this._addToHead(node)
}
}
};
leetcode146 LRU缓存机制
最新推荐文章于 2023-04-27 13:48:52 发布