【算法五十七】146. LRU 缓存

146. LRU 缓存 - 力扣(LeetCode)

HashMap + 双向链表:

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 int capacity;
    private Map<Integer,Node> map;
    private Node head;
    private Node tail;

    public LRUCache(int capacity){
        head = new Node();
        tail = new Node();

        this.capacity = capacity;
        this.map = new HashMap<>();

        head.next = tail;
        tail.prev = head;
    }

    public int get(int key){
        Node node = map.get(key);
        if(node == null){
            return -1;
        }
        
        removeToHead(node);
        return node.value;
    }

    public void put(int key,int value){
        Node node = map.get(key);
        if(node != null){
            removeToHead(node);
            node.value = value;
        }
        else{
            Node new_node = new Node();
            new_node.key = key;
            new_node.value = value;
            map.put(key,new_node); 

            moveToHead(new_node);
            if(map.size() > capacity){
                Node last = removeLast();
                map.remove(last.key);
            }
        }
    }

    private Node removeLast(){
        Node node = tail.prev;
        node.prev.next = tail;
        tail.prev = node.prev;
        return node;
    }

    private void moveToHead(Node node){
        node.prev = head;
        node.next = head.next;
        head.next.prev = node;
        head.next = node;
    }

    private void removeToHead(Node node){
        node.prev.next = node.next;
        node.next.prev = node.prev;
        node.prev = head;
        node.next = head.next;
        head.next.prev = node;
        head.next = node;
    }
}
相关推荐
不能跑的代码不是好代码16 分钟前
二叉树从基础概念到LeetCode实战
算法·leetcode
凯瑟琳.奥古斯特39 分钟前
二分查找解力扣1011最优运载能力
开发语言·c++·算法·leetcode·职场和发展
学计算机的计算基1 小时前
二叉树算法下篇:递归核心技巧与高频面试题详解
java·笔记·算法
水龙吟啸1 小时前
华为2026.6.24机考选择题+编程题【速刷敲黑板】
人工智能·深度学习·算法·机器学习·华为
Eloudy1 小时前
全文 - Evolution Strategies as a Scalable Alternative to Reinforcement Learning
人工智能·算法
net3m331 小时前
可以加大adc滑动滤波的间隔时间,比如定时每20ms采集一次滤波输入,且用滑动窗口均值滤波
算法
卷福同学8 小时前
不用服务器,不用配环境,我10分钟上线了一个AI Agent
人工智能·后端·算法
至乐活着10 小时前
深入解析跳表SkipList:原理、实现与性能优化实战
数据结构·算法·跳表·skiplist·java实现
Jerry11 小时前
LeetCode 383. 赎金信
算法
ai产品老杨11 小时前
H264 H265视频分析常见问题和排查清单
人工智能·算法·音视频