LeetCode.146. LRU Cache

https://leetcode.com/problems/lru-cache/

使用map加雙向鏈表的方式來存儲,get的時候,通過map獲取數據,put的時候,通過雙向鏈表的特性,可以在常量時間移動節點到頭部,刪除尾部節點。

class DoubleLinkNode {
    public DoubleLinkNode prev = null;
    public DoubleLinkNode next = null;
    public int key = 0;
    public int val = 0;

    public DoubleLinkNode(int key, int val, DoubleLinkNode prev, DoubleLinkNode next) {
        this.key = key;
        this.val = val;
        this.prev = prev;
        this.next = next;
    }
}

class LRUCache {

    int mCap = 0;
    int mLen = 0;

    DoubleLinkNode head;
    DoubleLinkNode tail;

    Map<Integer, DoubleLinkNode> maps = new HashMap<>();

    public LRUCache(int capacity) {
        mCap = capacity;

        head = new DoubleLinkNode(0,0, null, null);
        tail = new DoubleLinkNode(0, 0, null, null);

        head.next = tail;
        tail.prev = head;
    }

    public int get(int key) {
        if (maps.containsKey(key)) {
            DoubleLinkNode node = maps.get(key);

            DoubleLinkNode prev = node.prev;
            DoubleLinkNode next = node.next;

            prev.next = next;
            next.prev = prev;

            node.next = head.next;
            head.next.prev = node;

            head.next = node;
            node.prev = head;

            return node.val;
        } else {
            return -1;
        }
    }

    public void put(int key, int value) {
        if (maps.containsKey(key)) {
            DoubleLinkNode node = maps.get(key);
            node.val = value;

            DoubleLinkNode prev = node.prev;
            DoubleLinkNode next = node.next;

            prev.next = next;
            next.prev = prev;

            node.next = head.next;
            head.next.prev = node;

            head.next = node;
            node.prev = head;

        } else {
            DoubleLinkNode node = new DoubleLinkNode(key, value, head, null);

            node.next = head.next;
            head.next.prev = node;

            head.next = node;
            node.prev = head;

            mLen++;
            if (mLen > mCap) {
                maps.remove(tail.prev.key);
                DoubleLinkNode newTailPrev = tail.prev.prev;
                newTailPrev.next = tail;
                tail.prev = newTailPrev;
                mLen--;
            }

            maps.put(key, node);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章