LeetCode:146LRU缓存

java 复制代码
class LRUCache {

    //定义双向链表的节点结构
    class Node{
        int key;
        int value;
        Node prev;
        Node next;
        public Node(){};
        public Node(int key, int value){
            this.key = key;
            this.value = value;
        }
    }

    private Map<Integer,Node> cache = new HashMap<>();
    private int capacity;
    private int size;
    //头尾节点
    private Node head,tail;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.size = 0;
        //初始化头尾
        head = new Node();
        tail = new Node();
        head.next = tail;
        tail.prev = head;
    }
    //获取
    public int get(int key){
        Node node = cache.get(key);
        if(node == null){
            return -1;
        }
        moveToHead(node);
        return node.value;
    }
    //放入/更新
    public void put(int key, int value){
        Node node = cache.get(key);

        if(node == null){
            //全新的数据
            Node newNode = new Node(key,value);
            cache.put(key,newNode);
            addToHead(newNode);
            size++;
            //判断是否已满
            if(size > capacity){
                Node tailNode = removeTail();
                cache.remove(tailNode.key);
                size--;
            }
        }else{
            //更新数据
            node.value = value;
            moveToHead(node);
        }
    }
    //将一个节点抽出来,插到最前面(现有节点)
    private void moveToHead(Node node){
        removeNode(node);
        addToHead(node);
    }
    //将一个节点从现有位置取出来
    private void removeNode(Node node){
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }
    //放到最前面
    private void addToHead(Node node){
        node.prev = head;
        node.next = head.next;
        head.next.prev = node;
        head.next = node;
    }
    //逐出最久未使用的关键字
    private Node removeTail(){
        Node res = tail.prev;
        removeNode(res);
        return res;
    }
}

/**
 * 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);
 */

哈希表+双向链表的组合结构

写几个方法方便直接调用:

将一个节点直接插入到最前面的方法

将一个节点从当前位置取出来的方法

接节点抽出来放到最前面的方法

丢掉最久未使用的关键字的方法

相关推荐
原子延迟8 分钟前
视频太大怎么压缩发微信?先查限制再压的3种方法(2026)
开发语言·图像处理·人工智能·计算机视觉·音视频
FITA阿泽要努力30 分钟前
Fork Agent:共享上下文的艺术
开发语言·python·agent
小蒜学长32 分钟前
基于Spring Boot+Vue3的在线游戏技术指导师匹配系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·在线游戏技术指导
文丑颜不良啊32 分钟前
LeetCode226~250题目解析
java·leetcode
小小、码农1 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++
Dovis(誓平步青云)1 小时前
逆变器报警却找不到板子,热斑图怎样定位到具体组串
java·开发语言·人工智能·机器学习·卷积神经网络
坐吃山猪1 小时前
Python-Hermite基函数
开发语言·python
摇滚侠1 小时前
《Java并发编程之美》第 2 章 并发编程的其他基础知识 阅读笔记 3
android·java·笔记
空~自由1 小时前
Python 正则 . * ? .* .*? (.*?) 通俗讲解
开发语言·python
墨子夕2 小时前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(第一篇)
java·python·设计模式