JAVA算法练习题day27

35.LRU缓存

cpp 复制代码
class LRUCache {
    //手写双链表 自己完整独立的写写,好吧,加油。实在写不出再看题解
    //双向链表
    private static class Node{
        int key,value;
        Node prev,next;
        //写初始化方法
        Node(int k, int v){
            key = k;
            value = v;
        }
    }
    private final int capacity;
    private final Node dummy = new Node(0,0);
    private final Map<Integer,Node> key2Node = new HashMap<>();
    public LRUCache(int capacity) {
        this.capacity = capacity;
        //这里还要对dummy进行前后指针的初始化
        dummy.next = dummy;
        dummy.prev = dummy;
    }
    
    //需要返回关键字的值
    public int get(int key) {
        //查询该关键字是否存在对应节点,若存在,将该节点删除而后将该节点放到链表开头,返回关键字的值(也就是节点的值);若不存在则返回-1
        //优化一下,既然get和put都需要去先删除再置顶:写函数getnode,该函数先将节点删除,而后将其置顶
        //再写一个删除节点的函数就好
        Node key2node = getNode(key);
        if(key2node==null) return -1;
        else return key2node.value;
    }
    
    public void put(int key, int value) {
        Node key2node = getNode(key);
        //修改key对应的值为value
        if(key2node!=null){
            key2node.value = value;
        }
        else{
            if(key2Node.size() >= capacity){
                //双向有环链表,找头部就是dummy.next;找尾部就是dummy.prev
                Node lastNode = dummy.prev;
                remove(lastNode);
                //哈希表删除一个
                key2Node.remove(lastNode.key);
                //把新节点放到头部
                Node putnewNode = new Node(key,value);
                push2head(putnewNode);
                //哈希表插入一个
                key2Node.put(key,putnewNode);
            }
            else{
                Node node = new Node(key,value);
                push2head(node);
                key2Node.put(key,node);
            }
        }
    }
    //getNode()
    private Node getNode(int key){
        if(key2Node.containsKey(key)){
            Node node = key2Node.get(key);
            remove(node);
            push2head(node);
            return node;
        }
        else return null;
    }
    //remove()
    private void remove(Node node){
        node.next.prev = node.prev;
        node.prev.next = node.next;
    }
    //push2head
    private void push2head(Node x){
        x.next = dummy.next;
        x.prev=dummy;
        dummy.next.prev=x;
        dummy.next=x;
        //x.prev=dummy;
        //x.next=dummy.next;
        //x.prev.next=x;
        //x.next.prev=x;
    }
}

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */
相关推荐
述清-架构师之路15 小时前
【亲测可用】idea设置mvn默认版本路径,setting路径,仓库路径
java·ide·intellij-idea
往今~15 小时前
Matlab: 绘制GDS图纸
开发语言·matlab
ULTRA??16 小时前
插入排序算法实现(二分查找搜索版本)
c++·算法
Elias不吃糖16 小时前
LeetCode 71:简化 Unix 路径(Simplify Path)——栈 / vector
算法·leetcode·
sheeta199816 小时前
LeetCode 每日一题笔记 日期:2025.12.15 题目:2110.股票平滑下跌阶段的数目
笔记·算法·leetcode
泡泡以安17 小时前
【Android逆向工程】第3章:Java 字节码与 Smali 语法基础
android·java·安卓逆向
毕设源码-朱学姐1 天前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
郭涤生1 天前
布隆过滤器
c++
喵了meme1 天前
C语言实战4
c语言·开发语言
码界奇点1 天前
Python从0到100一站式学习路线图与实战指南
开发语言·python·学习·青少年编程·贴图