LeetCode刷题3:LRU缓存机制

请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。

具体题目:146. LRU 缓存 - 力扣(LeetCode) (leetcode-cn.com)

首先设计哈希表加双向链表的数据结构

HashMap<Integer,Node>cache

通过哈希表的键可以找到缓存数据在双向链表中的位置,而双向链表主则按照键值对使用的顺序进行顺序存储

 

 

 

 

 

复制代码
class LRUCache {
    private int cap;
    public Node head;
    public Node tail;
    public HashMap<Integer,Node>cache;

//初始化缓存
public LRUCache(int capacity) { cache=new HashMap<>(); head=new Node(-1,-1); tail=new Node(-1,-1); head.next=tail; tail.pre=head; this.cap=capacity; } public int get(int key) { Node node=cache.get(key); if(node==null) return -1; moveToTail(node,node.val);//最近使用 return node.val; } public void put(int key, int value) { if(cache.containsKey(key)){//已存在则为最近使用,移到末尾 Node node=cache.get(key); moveToTail(node,value); } else { if(cache.size()==this.cap){//cache是否已满 Node node=head.next; delete(node); cache.remove(node.key); } Node newNode=new Node(key,value); insertTail(newNode); cache.put(key,newNode); } } public void insertTail(Node node){ node.pre=tail.pre; node.next=tail; tail.pre.next=node; tail.pre=node; } public void delete(Node node){ node.pre.next=node.next; node.next.pre=node.pre; } public void moveToTail(Node node,int val){ delete(node); insertTail(node); node.val=val; } } class Node{ public int val; public int key; public Node pre; public Node next; public Node(int key,int val){ this.key=key; this.val=val; } }
复制代码

 

posted @   Jane'scodehouse  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示