美文网首页
leetcode 146.LRU Cache

leetcode 146.LRU Cache

作者: 我不懂我不懂a | 来源:发表于2021-06-26 11:18 被阅读0次

    HashMap + 双向链表,用LinkedList替代过head、tail, 直接超时。

    class LRUCache {
        Node head;
        Node tail;
        int size;
        int capacity;
    
        HashMap<Integer, Node> map = null;
    
        public LRUCache(int capacity) {
            this.capacity = capacity;
            this.size = 0;
            map = new HashMap(capacity);
        }
    
        public int get(int key) {
            if(size == 0) return -1;
    
            Node node = map.get(key);
            if(node == null) {
                return -1;
            }
            transferNodeLast(node);
            return node.value;
        }
    
        public void put(int key, int value) {
            Node node = map.get(key);
            if(node != null) {
                node.value = value;
                transferNodeLast(node);
            }
            else {
                Node newNode = new Node(key, value);
                map.put(key, newNode);
                linkNodeLast(newNode);
                size++;
            }
            if(size > capacity) {
                Node first = head;
                head = head.next;
                if(head != null) {
                    head.prev = null;
                }
                map.remove(first.key);
                size--;
            }
        }
    
        private void linkNodeLast(Node node) {
            Node last = tail;
            tail = node;
            if(head == null)
                head = tail;
            else {
                last.next = node;
                node.prev = last;
            }
        }
    
    
    
        private void transferNodeLast(Node node) {
            if(node != tail) {
                Node last = tail;
                Node next = node.next;
                if(node != head) {
                    Node prev = node.prev;
                    prev.next = next;
                    next.prev = prev;
                } else {
                    head = next;
                    head.prev = null;
                }
                last.next = node;
                node.prev = last;
                node.next = null;
                tail = node;
            }
        }
    
        class Node {
            int key;
            int value;
            Node next;
            Node prev;
    
            public Node(int key, int value) {
                this.key = key;
                this.value = value;
            }
        }
    
    }
    
    image.png

    相关文章

      网友评论

          本文标题:leetcode 146.LRU Cache

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