美文网首页
leetcode146. LRU缓存机制

leetcode146. LRU缓存机制

作者: 今天不想掉头发 | 来源:发表于2019-07-22 23:25 被阅读0次
    image.png

    双向链表+哈希表实现LRU

    class LRUCache {
        
        public static class LinkedNode {
            int key;
            int val;
            LinkedNode prev;
            LinkedNode next;
            public LinkedNode(int key, int val) {
                this.key = key;
                this.val = val;
            }
        }
    
        Map<Integer, LinkedNode> map;
        LinkedNode head;
        LinkedNode tail;
        int capacity;
        int count;
        
        public LRUCache(int capacity) {
            map = new HashMap<>();
            head = new LinkedNode(0, 0);
            tail = new LinkedNode(0, 0);
            head.next = tail;
            tail.prev = head;
            this.capacity = capacity;
            count = 0;
        }
        
        // 移除尾结点前面的节点
        public void removeTail() {
            if (tail.prev == head) throw new IllegalArgumentException("There is no node to remove");
            LinkedNode node = tail.prev;
            tail.prev.prev.next = tail;
            tail.prev = tail.prev.prev;
        }
        
        // 将node节点添加到头结点后面
        public void addToHead(LinkedNode node) {
            node.next = head.next;
            head.next.prev = node;
            head.next = node;
            node.prev = head;
        }
        
        // 删除node节点
        public void removeNode(LinkedNode node) {
            node.prev.next = node.next;
            node.next.prev = node.prev;
        }
        
        public int get(int key) {
            if (map.containsKey(key)) {
                LinkedNode node = map.get(key);
                removeNode(node);
                addToHead(node);
                return node.val;
            }
            return -1;
        }
        
        public void put(int key, int value) {
            if (map.containsKey(key)) {
                LinkedNode node = map.get(key);
                node.val = value;
                removeNode(node);
                addToHead(node);
            } else {
                LinkedNode node = new LinkedNode(key, value);
                if (count == capacity) {              
                    map.remove(tail.prev.key);
                    removeTail();
                    addToHead(node);
                    map.put(key, node);
                } else {
                    addToHead(node);
                    map.put(key, node);
                    count++;
                }
            }
        }
    }
    
    /**
     * 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);
     */
    

    相关文章

      网友评论

          本文标题:leetcode146. LRU缓存机制

          本文链接:https://www.haomeiwen.com/subject/conglctx.html