Leetcode 146. LRU 缓存 (Day 13)

javascript 复制代码
class Node {
    constructor(key =0 ,value=0){
        this.key=key;
        this.value=value;
        this.next = null;
        this.prev=null;
    }
}

class LRUCache{
    constructor(capacity){
        this.capacity=capacity;
        this.dummy=new Node();
        this.dummy.next=this.dummy;
        this.dummy.prev=this.dummy;
        this.idx=new Map();
    }
    #getNode(key){
        if(!this.idx.has(key)) return null;
        const node=this.idx.get(key);
        this.#remove(node);
        this.#pushFront(node);    
        return node;
    }

    get(key){
        const node=this.#getNode(key);
        return node?node.value:-1;
    }

    put(key,value){
       let node=this.#getNode(key);
       if(node){
            node.value=value;
            return ;
       }
       else{
            node=new Node(key,value); 
            this.idx.set(key,node);
            this.#pushFront(node);
       }
        
        if(this.idx.size>this.capacity){
            const backNode=this.dummy.prev;
            this.idx.delete(backNode.key);
            this.#remove(backNode);
        }
    }
    #remove(node){
        node.prev.next=node.next;
        node.next.prev=node.prev;
    }
    #pushFront(node){
        node.prev=this.dummy;
        node.next=this.dummy.next;
        node.prev.next=node;
        node.next.prev=node;
    }
}

算法核心:双向链表+哈希

javascript 复制代码
	this.dummy.next=this.dummy;
	this.dummy.prev=this.dummy;

	node.next=this.dummy.next;
	node.next.prev=node;
	

这样初始化可以保证dummy.prev始终指向尾结点
注意this的使用

相关推荐
MoonOutCloudBack6 分钟前
VeRL 框架下 RL 微调 DeepSeek-7B,比较 PPO / GRPO 脚本的参数差异
人工智能·深度学习·算法·语言模型·自然语言处理
_F_y33 分钟前
二叉树中的深搜
算法
锅包一切1 小时前
PART17 一维动态规划
c++·学习·算法·leetcode·动态规划·力扣·刷题
Polaris北1 小时前
第二十六天打卡
c++·算法·动态规划
罗湖老棍子2 小时前
【例 2】选课(信息学奥赛一本通- P1576)
算法·树上背包·树型动态规划
每天要多喝水2 小时前
动态规划Day33:编辑距离
算法·动态规划
每天要多喝水2 小时前
动态规划Day34:回文
算法·动态规划
weixin_477271692 小时前
马王堆帛书《周易》系统性解读(《函谷门》原创)
算法·图搜索算法
AomanHao3 小时前
【ISP】基于暗通道先验改进的红外图像透雾
图像处理·人工智能·算法·计算机视觉·图像增强·红外图像
We་ct3 小时前
LeetCode 226. 翻转二叉树:两种解法(递归+迭代)详解
前端·算法·leetcode·链表·typescript