leetcode LRU Cache

本文介绍了一种基于双链表和哈希映射的数据结构实现LRU(Least Recently Used)缓存的方法。该实现支持get和set操作,并确保当缓存达到容量限制时能够移除最久未使用的项。

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

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.

set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item。

数据结构:双链表、hashmap

双链表我们只需要定义删除结点操作和将结点插入到队首两个操作;

当调用getKey时,若为null则返回-1,否则返回此结点的值,并将该结点插入队首,代表最近刚刚使用;

调用setKey时,若为null则需要加入新key,此时判断capacity是否超标,超标删除链表队尾结点,若不为null需要更新此结点的值,并将此节点插入到队首。

参考:https://discuss.leetcode.com/topic/34701/java-easy-version-to-understand/2

代码:

public class LRUCache {
    int capacity;
    Map<Integer,Node> map;
    Node head;
    Node tail;
    int nums;
    class Node{
        public Node(int key,int val){
            this.key=key;
            this.value=val;
        }
        int key;
        int value;
        Node pre;
        Node next;
    }
    public LRUCache(int capacity) {
        this.capacity=capacity;
        map=new HashMap<>();
        head=new Node(-1,-1);
        tail=new Node(-1,-1);
        head.next=tail;
        tail.pre=head;
        this.nums=0;
    }
    public void DeleteNode(Node node){
        node.pre.next=node.next;
        node.next.pre=node.pre;
    }
    public void addToHead(Node node){
        node.next=head.next;
        head.next.pre=node;
        head.next=node;
        node.pre=head;
    }
    public int get(int key) {
        Node node=map.get(key);
        if(node!=null){
           DeleteNode(node);
            addToHead(node);
            return node.value;
        }
        else return -1;
    }

    public void set(int key, int value) {
         if(map.get(key)==null){
             Node node = new Node(key, value);
             map.put(key,node);
             if(nums<capacity) {
                 nums++;
                 addToHead(node);
             }
             else{
                 map.remove(tail.pre.key);
                 DeleteNode(tail.pre);
                 addToHead(node);
             }
         }
        else{
             Node node=map.get(key);
             node.value=value;
             DeleteNode(node);
             addToHead(node);
         }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值