第291天学习打卡(知识点回顾 LRU)

知识点回顾

LRU

  • LRU是最近最少使用,是一种常用的页面置换算法,选择最近最近未使用的数据予以淘汰。

 public class LRUCache{
     private int capacity;
     private Map<Integer, ListNode>map;
     private ListNode head;
     private ListNode tail;
     public LRUCache(int capacity){
         this.capacity = capacity;
         map = new HashMap<Integer, ListNode>();
         head = new ListNode(-1,-1);
         tail = new ListNode(-1,-1);
         head.next = tail;
         tail.pre = head;
    }
     public int get(int key){
         //没有就返回-1
         if(!map.containsKey(key)){
             return -1;
        }
         //有就获取这个值 然后把它删除移动到尾部
         ListNode node = map.get(key);
         //这两句相当于把node的前一个和后一个节点连接 然后删除Node
         node.pre.next = node.next;
         node.next.pre = node.pre;
         moveToTail(node);
         return node.val;//这里是返回节点的值
         
 
    }
     public void put(int key, int value){
           // 直接调用这边的get方法,如果存在,它会在get内部被移动到尾巴,不用再移动一遍,直接修改值即可
         if(get(key)!=-1){
             map.get(key).val = value;
             return;
        }
         ListNode node = new ListNode(key, value);
         map.put(key, node);
         moveToTail(node);
         if(map.size() > capacity){
             map.remove(head.next.key);
             head.next = head.next.next;
             head.next.pre = head;
 
        }
         
    }
     private void moveToTail(ListNode node){
         //node节点的前一个节点指向了tail.pre节点 就说明node移动到了真正的尾部
         node.pre = tail.pre;
         tail.pre = node;
         node.pre.next= node;
         node.next = tail;
    }
     private class ListNode{
         int key;
         int val;
         ListNode pre;
         ListNode next;
         public ListNode(int key, int val){
             this.key = key;
             this.val = val;
             pre = null;
             next =null;
        }
    }
 }

尚硅谷2021逆袭版Java面试题第三季(java大厂面试题,周阳主讲)哔哩哔哩bilibili

posted @ 2021-10-26 22:41  豆豆tj  阅读(78)  评论(0编辑  收藏  举报