ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【hot100-java】LRU 缓存 [打印本页]

作者: 万万哇    时间: 2024-10-15 18:26
标题: 【hot100-java】LRU 缓存
链表篇

灵神题解

 


 
  1. class LRUCache {
  2.     private static class Node{
  3.         int key,value;
  4.         Node prev,next;
  5.         Node (int k,int v){
  6.             key=k;
  7.             value=v;
  8.         }
  9.     }
  10.     private final int capacity;
  11.     //哨兵节点
  12.     private final Node dummy=new Node(0,0);
  13.     private final Map<Integer,Node> keyToNode =new HashMap<>();
  14.     public LRUCache(int capacity) {
  15.         this.capacity=capacity;
  16.         dummy.prev=dummy;
  17.         dummy.next=dummy;
  18.     }
  19.    
  20.     public int get(int key) {
  21.            Node node=getNode(key);
  22.            return node!=null?node.value:-1;
  23.     }
  24.    
  25.     public void put(int key, int value) {
  26.           Node node=getNode(key);
  27.           //有书则更新
  28.           if(node!=null){
  29.             node.value=value;
  30.             return;
  31.           }
  32.           node=new Node(key,value);
  33.           keyToNode.put(key,node);
  34.           //放在最上面
  35.           pushFront(node);
  36.           //书太多了
  37.           if(keyToNode.size()>capacity){
  38.               Node backNode=dummy.prev;
  39.               keyToNode.remove(backNode.key);
  40.               //去掉最后一本书
  41.               remove(backNode);
  42.           }
  43.     }
  44.     //取节点
  45.     private Node getNode(int key){
  46.         //没有这本书
  47.         if(!keyToNode.containsKey(key)){
  48.             return null;
  49.         }
  50.         //有这本书
  51.         Node node=keyToNode.get(key);
  52.         //抽出来
  53.         remove(node);
  54.         //放在最上面
  55.         pushFront(node);
  56.         return node;
  57.     }
  58.     //删除一个节点(抽出一本书)
  59.     private void remove(Node x){
  60.         x.prev.next=x.next;
  61.         x.next.prev=x.prev;
  62.     }
  63.     //链表头添加节点
  64.     private void pushFront(Node x){
  65.         x.prev=dummy;
  66.         x.next=dummy.next;
  67.         x.prev.next=x;
  68.         x.next.prev=x;
  69.     }
  70. }
  71. /**
  72. * Your LRUCache object will be instantiated and called as such:
  73. * LRUCache obj = new LRUCache(capacity);
  74. * int param_1 = obj.get(key);
  75. * obj.put(key,value);
  76. */
复制代码
 
背题

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4