【d59】【Java】【力扣】146.LRU缓存

devtools/2024/12/22 10:56:21/

思路

代码

  class LRUCache {//初始化节点:key+value+pre+nextclass Node {int key;int value;Node next;Node prev;public Node(int key, int value) {this.key = key;this.value = value;}}//设置链表需要的属性//最大容量int capacity=0;//当前长度int size=0;//头节点Node head;//尾节点//!!尾节点也要弄使用那种空节点Node rear;//初始化链表,本质就是对链表的属性 进行一些初始的设置public LRUCache(int capacity){this.capacity=capacity;//使用-1作为区分head=new Node(-1, -1);rear=new Node(-2, -2);rear.prev=head;head.next=rear;}/*** 根据key寻找节点,如果存在,返回节点* 如果不存在,返回null* @param key 需要找的节点的key* @return 返回整个节点node*/public Node getNode(int key){//判断是否当前节点的key等于 "参数key"Node cur=head.next;while(cur!=null){if (cur.key==key){return cur;}cur=cur.next;}//全部遍历后,还没有返回,说明没有这个节点,所以返回nullreturn null;}/*** 根据key寻找节点,并返回value,* 如果存在这个节点,返回value* 如果不存在,返回-1* 同时注意:使用这个方法以后,需要把这个节点放到头部* @param key* @return*/public int get(int key){Node node = getNode(key);if (node==null){return -1;}//没有返回,说明存在这个节点,则返回节点的value//同时做最近使用处理hadUsed(node);return node.value;}/*** 如果key存在,更改这个value* 如果不存在,先头增,再判断是否需要尾删* @param key* @param value*/public void put(int key, int value){Node nodeGet = getNode(key);//如果存在if (nodeGet!=null){nodeGet.value=value;hadUsed(nodeGet);}//如果不存在else {Node nodeAdd = new Node(key, value);//头增,并size++,,如果这个put是第一次,那么,rear就要向后走addFirst(nodeAdd);size++;//判断是否尾删if (size>capacity){removeLast();}}}//头增,并判断是不是第一次public boolean addFirst(Node node){node.next=head.next;node.prev=head;node.next.prev=node;head.next=node;return true;}//尾删:public boolean removeLast(){Node nodeToRemove=rear.prev;removeByNode(nodeToRemove);return true;}//把当前节点,在链表中删除private void removeByNode(Node node) {//最好 4个操作都写好//删除需要 解除这个节点和链表的联系,所以pre和next都要赋空值node.prev.next=node.next;node.next.prev=node.prev;node.next=null;node.prev=null;}public void hadUsed(Node node){removeByNode(node);addFirst(node);}}

记录

总结

尾删是一种 特殊的  删除某个元素

所以可以直接调用:删除某个元素


http://www.ppmy.cn/devtools/122289.html

相关文章

Vue3 指令详解

一、构建指令 1. 生命周期 created:在指令被绑定到元素之前调用。这个钩子很少使用,因为指令通常在元素存在时才需要进行操作。 beforeMount:在指令绑定的元素被插入到 DOM 之前调用。 mounted:在指令绑定的元素被插入到 DOM 后调…

Watchdog Timers(WDT)

文章目录 1. 介绍2. Feature List3. 概述3.1. Safety Watchdog3.2. CPU Watchdog 4. 看门狗定时器功能5. Endinit Functions5.1 Password Access to WDTxCON05.1.1 Static Password5.1.2 Automatic Password Sequencing 5.2 Check Access to WDTxCON05.3 Modify Access to WDTx…

Vue.js组件开发详解

Vue.js组件开发详解 Vue.js 是一个用于构建用户界面的渐进式框架,其核心思想是通过数据驱动视图的变化,同时提供了一系列强大的工具来帮助开发者高效地开发复杂的单页应用。在 Vue.js 中,组件是构建复杂应用的基本单元,通过组件化…

ansible学习

ansible学习 介绍 Ansible是一个基于Python开发的自动化运维工具,它集合了众多运维工具(如puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 前置环境准备: …

【数据结构】什么是哈希表(散列表)?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌哈希表的概念 📌哈希函数的构造方法 🎏直接定址法 🎏除留余数法 🎏平方取中法 🎏折叠法 &#x…

java往word中添加水印,往excel中添加图片

通过aspose-words往word中添加水印 1、添加依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8.0</version><scope>system</scope><systemPath>${project.bas…

Python水循环标准化对比算法实现

&#x1f3af;要点 算法区分不同水循环数据类型&#xff1a;地下水、河水、降水、气温和其他&#xff0c;并使用相应标准化降水指数、标准化地下水指数、标准化河流水位指数和标准化降水蒸散指数。绘制和计算特定的时间序列比较统计学相关性。使用相关矩阵可视化集水区和显示空…

使用 Python 遍历文件夹

要解决这个问题&#xff0c;使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树&#xff0c;找到所有的 text 文件&#xff0c;读取内容&#xff0c;处理空行和空格&#xff0c;并将处理后的内容合并到一个新的文件中。 整体思路&#xff1a; 遍历子目录&#xff1…