Leetcode 16.25 LRU缓存 哈希表与双向链表的组合

  首先,既然是缓存,哈希表是必须用到的,保证以 O(1) 时间复杂度进行查询。

  另外需要维护元素的使用顺序,不断将近期使用的元素推向前方,并在超出容量时删除末尾元素,这里使用双向链表实现对使用顺序的维护。

复制代码
    class LRUCache {

        class ListNode {
            ListNode pre;
            ListNode next;
            int val;
            int key;

            ListNode(int key, int val) {
                this.key = key;
                this.val = val;
            }
        }

        private final int capacity;
        private final Map<Integer, ListNode> pool;
        private ListNode head;
        private ListNode last;
        private int length;

        LRUCache(int capacity) {
            this.capacity = capacity;
            pool = new HashMap<Integer, ListNode>();
            head = new ListNode(0, 0);
            last = new ListNode(0, 0);
            head.next = last;
            last.pre = head;
            length = 0;
        }


        public int get(int key) {
            if (!pool.containsKey(key)) {
                return -1;
            }
            ListNode node = pool.get(key);
            removeToHead(node);
            return node.val;
        }

        public void put(int key, int value) {
            if (pool.containsKey(key)) {
                ListNode node = pool.get(key);
                node.val = value;
                removeToHead(node);
                return;
            }
            ListNode node = new ListNode(key, value);
            addToHead(node);
            pool.put(key, node);
            length++;
            if (length > capacity) {
                pool.remove(removeLast().key);
            }
        }

        private void removeNode(ListNode node) {
            node.pre.next = node.next;
            node.next.pre = node.pre;
            node.pre = node.next = null;
        }

        private void addToHead(ListNode node) {
            node.next = head.next;
            node.pre = head;
            head.next.pre = node;
            head.next = node;
        }

        private void removeToHead(ListNode node) {
            removeNode(node);
            addToHead(node);
        }

        private ListNode removeLast() {
            ListNode node = last.pre;
            if (node == head) {
                return null;
            }
            removeNode(node);
            return node;
        }
    }
复制代码

 

posted @   牛有肉  阅读(270)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示