LRU缓存

public class LRUCache {

   class DLinkedNode {

       int key;

       int value;

       DLinkedNode prev;

       DLinkedNode next;

       public DLinkedNode() {}

       public DLinkedNode(int _key, int _value) {key = _key; value = _value;}

   }

   private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();

   private int size;

   private int capacity;

   private DLinkedNode head, tail;

   public LRUCache(int capacity) {

       this.size = 0;

       this.capacity = capacity;

       // 使用伪头部和伪尾部节点

       head = new DLinkedNode();

       tail = new DLinkedNode();

       head.next = tail;

       tail.prev = head;

   }

   public int get(int key) {

       DLinkedNode node = cache.get(key);

       if (node == null) {

           return -1;

       }

       // 如果 key 存在,先通过哈希表定位,再移到头部

       moveToHead(node);

       return node.value;

   }

   public void put(int key, int value) {

       DLinkedNode node = cache.get(key);

       if (node == null) {

           // 如果 key 不存在,创建一个新的节点

           DLinkedNode newNode = new DLinkedNode(key, value);

           // 添加进哈希表

           cache.put(key, newNode);

           // 添加至双向链表的头部

           addToHead(newNode);

           ++size;

           if (size > capacity) {

               // 如果超出容量,删除双向链表的尾部节点

               DLinkedNode tail = removeTail();

               // 删除哈希表中对应的项

               cache.remove(tail.key);

               --size;

           }

       }

       else {

           // 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部

           node.value = value;

           moveToHead(node);

       }

   }

   private void addToHead(DLinkedNode node) {

       node.prev = head;

       node.next = head.next;

       head.next.prev = node;

       head.next = node;

   }

   private void removeNode(DLinkedNode node) {

       node.prev.next = node.next;

       node.next.prev = node.prev;

   }

   private void moveToHead(DLinkedNode node) {

       removeNode(node);

       addToHead(node);

   }

   private DLinkedNode removeTail() {

       DLinkedNode res = tail.prev;

       removeNode(res);

       return res;

   }

}

题目链接

. - 力扣(LeetCode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值