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

146. LRU 缓存机制

作者: justonemoretry | 来源:发表于2021-07-26 21:12 被阅读0次
image.png

解法

class LRUCache {

    class Node {

        Node pre;

        Node next;

        int key;

        int value;

        public Node() {

        }

        public Node(int key, int value) {
            this.key = key;
            this.value = value;
        }
    }

    private Map<Integer, Node> map;

    private int capacity;

    private int size;

    private Node tail;

    private Node head;

    public LRUCache(int capacity) {
        map = new HashMap((int) Math.ceil(capacity / 0.75));
        this.capacity = capacity;
        this.size = 0;
        this.head = new Node();
        this.tail = new Node();
        head.next = tail;
        tail.pre = head;
    }
    
    public int get(int key) {
        Node node = map.get(key);
        if (node == null) {
            return -1;
        }
        // 链表调整
        moveToHead(node);
        return node.value;
    }
    
    public void put(int key, int value) {
        Node node = map.get(key);
        if (node != null) {
            node.value = value;
            moveToHead(node);
        } else {
            Node newNode = new Node(key, value);
            map.put(key, newNode);
            addToHead(newNode);
            size++;
            if (size > capacity) {
                int k = removeTail();
                map.remove(k);
                size--;
            }
        }
        
    }

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

    private void moveToHead(Node node) {
        node.pre.next = node.next;
        node.next.pre = node.pre;
        addToHead(node);
    }

    private int removeTail() {
        Node pre = tail.pre;
        tail.pre.pre.next = tail;
        tail.pre = tail.pre.pre;
        return pre.key;
    }
}

相关文章

网友评论

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

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