LRU编写

47 阅读1分钟
class LRUCache {
    private int capacity;
    HashMap<Integer, Node> map;
    Node dummy = new Node(-1, -1);

    public LRUCache(int capacity) {
        this.capacity = capacity;
        dummy.next = dummy;
        dummy.pre = dummy;
        map = new HashMap<Integer, Node>();
    }

    public int get(int key) {
        if (!map.containsKey(key))
            return -1;
        // node放在最前面
        Node node = remove(map.get(key));
        addFirst(node);
        return node.val;
    }

    public void put(int key, int value) {
        Node node = new Node(key, value);
        if (!map.containsKey(key)) {
            if (map.size() >= capacity) {
                Node pre = dummy.pre;
                map.remove(pre.key);
                remove(pre);
            }
            map.put(key, node);
            addFirst(node);
        } else {
            Node node1 = map.get(key);
            node1.val = value;
            remove(node1);
            addFirst(node1);
        }
        return;
    }

    public void addFirst(Node node) {
        node.pre = this.dummy;
        dummy.next.pre = node;
        node.next = dummy.next;
        dummy.next = node;
    }

    public Node remove(Node node) {
        node.pre.next = node.next;
        node.next.pre = node.pre;
        return node;
    }

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

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

/**
 * 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);
 */

用map保存key和node,并维护一个node双向链表