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的使用

相关推荐
To_OC3 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎4 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC5 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn6 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹6 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
雪碧聊技术6 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划
CV-Climber9 小时前
检索技术的实际应用
人工智能·算法
hhzz10 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
从零开始的代码生活_10 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法