[LeetCode]LRU Cache

本文介绍了一种基于Java实现的LRUCache设计方法。通过自定义节点类和双向链表,结合HashMap来实现高效的数据存取。文章详细阐述了LRUCache的工作原理及其在内存限制条件下如何操作缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道很好的题目。也是从这俩天开始,对于面试的准备加入了Java 语言基础这一部分。 而这个题目,是一个很好的特殊功能多class的设计实现题
代码主要思路参考code ganker的代码,其中做了一些小的改动未来更好理解。

//这个题目,重点体会大是LRUCache这个class的设计思想。
public class LRUCache {
    class node{
        node prev,nxt;
        int key;
        int val;
        public node(int key , int val){
            this.key = key;
            this.val = val;
        }
    }
    private node first,last;
    private int capacity;
    private int num;
    private HashMap map;
    
    public LRUCache(int capacity) {
        this.capacity = capacity;
        num = 0;
        map = new HashMap();
        first = null;
        last = null;
    }
    
    public int get(int key) {
        node n = map.get(key);
        if(n==null)
            return -1;
        else{
            if(n != last){
                if(n==first){
                    first = first.nxt;
                    first.prev = null;
                }else{
                    n.nxt.prev = n.prev;
                    n.prev.nxt = n.nxt;
                }
                last.nxt = n;
                n.prev = last;
                n.nxt = null;
                last = n;
            }
            return n.val;
        }
    }
    
    public void set(int key, int value) {
        node n = map.get(key);
        if(n==null){
            node newNode = new node(key, value);
            map.put(key,newNode);
            if(num>=capacity){
                map.remove(first.key);
                first = first.nxt;
                
                if(first != null){
                    first.prev = null;
                }else{
                    last = null;
                }
                num--;
            }
            
            if(first == null || last == null){
                 first = newNode;
                 last = newNode;
             }else{
                 last.nxt = newNode;
                 newNode.prev = last;
                 last = last.nxt;
            }
            num ++;
            
        }else{
            n.val = value;
            if(n != last){
                if(n==first){
                    first = first.nxt;
                    first.prev = null;
                }else{
                    n.nxt.prev = n.prev;
                    n.prev.nxt = n.nxt;
                }
                last.nxt = n;
                n.prev = last;
                n.nxt = null;
                last = n;
            }
            
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值