146. LRU 缓存

目录

题目链接

题目

解题思路

代码


题目链接

146. LRU 缓存 - 力扣(LeetCode)

题目

解题思路

哈希+双向链表:哈希能够实现时间查询和增加的时间复杂度为o(1),双向链表能否实现删除最久不使用其超过长度的

代码
java 复制代码
class LRUCache {
    class DecLinkedList{
        int key;
        int val;
        DecLinkedList next;
        DecLinkedList pre;
        DecLinkedList(){}
        DecLinkedList(int _key,int _val){key=_key;val=_val;}
    }
    HashMap<Integer,DecLinkedList> map=new HashMap<>();
    int size;
    int capacity;
    DecLinkedList head;
    DecLinkedList tail;
    public LRUCache(int capacity) {
        this.capacity=capacity;
        size=0;
        head=new DecLinkedList();
        tail=new DecLinkedList();
        head.next=tail;
        tail.pre=head;
    }
    
    public void deleteNode(DecLinkedList node){
        node.next.pre=node.pre;
        node.pre.next=node.next;
    }
    public void moveToHead(DecLinkedList node){
        node.next=head.next;
        node.pre=head;
        head.next.pre=node;
        head.next=node;
    }
    public void addTohead(DecLinkedList node){
        deleteNode(node);
        moveToHead(node);
    }
    public int get(int key) {
        DecLinkedList node=map.get(key);
        if(node!=null){
            addTohead(node);
            return node.val;
        }
        return -1;
    }
    
    public DecLinkedList deleteAll(){
        DecLinkedList node=tail.pre;
        deleteNode(node);
        return node;
    }
    public void put(int key, int value) {
         DecLinkedList node=map.get(key);
         if(node==null){
            size++;
            node=new DecLinkedList(key,value);
            if(size>capacity){
                DecLinkedList cur= deleteAll();
                map.remove(cur.key);
                size--;
            }
            moveToHead(node);
         }else{
            node.val=value;
            addTohead(node);
         }
         map.put(key,node);
    }
}

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