基于链表实现LRU缓存淘汰算法
package com.example.demo;
/**
* 有序单链表实现lru
* 思路:1.如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。
* 2.如果此数据没有在缓存链表中,又可以分为两种情况:
* 如果此时缓存未满,则将此结点直接插入到链表的头部;
* 如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。
*/
public class Lc_LRU {
public static class LinkList {
int node;
LinkList next;
public LinkList() {
}
public LinkList(int node, LinkList next) {
this.node = node;
this.next = next;
}
public LinkList(int node) {
this.node = node;
}
public int getNode() {
return node;
}
public void setNode(int node) {
this.node = node;
}
public LinkList getNext() {
return next;
}
public void setNext(LinkList next) {
this.next = next;
}
}
//链表最大长度
int size = 10;
//遍历链表
private boolean traversal(LinkList newNode, LinkList linkList) {
LinkList curr = linkList;
while (curr != null) {
if (curr.node != newNode.node) {
curr = curr.next;
} else {
return true;
}
}
return false;
}
//遍历链表是否存在新插入的值,存在则删除
private LinkList delete(LinkList head, LinkList toRemove) {
if(head.node == toRemove.node){
return head.next;
}
LinkList pre = head;
LinkList curr = head;
while(curr!=null){
if(curr.node == toRemove.node){
pre.next = curr.next;
return pre;
}else{
pre = curr;
}
curr = curr.next;
}
return null;
}
//删除最后一个节点
private void deleteLastNode(LinkList linkList) {
LinkList curr = linkList;
int position = 0;
while (curr != null && position != 8) {
position++;
curr = curr.next;
}
curr.next = null;
}
//遍历链表长度
private int count(LinkList linkList) {
LinkList curr = linkList;
int count = 0;
while (curr != null) {
count++;
curr = curr.next;
}
return count;
}
//插入新节点,检查是否存在该节点,若存在删除原来位置的节点,插入到头,如果不存在,直接插入到头
private LinkList insert(LinkList newNode, LinkList linkList) {
if (count(linkList) < 10) {
//go on
} else {
deleteLastNode(linkList);
}
linkList = delete(linkList,newNode);
LinkList head = newNode;
head.next = linkList;
return head;
}
private void sysoLinkList(LinkList linkList) {
StringBuffer stringBuffer = new StringBuffer();
LinkList curr = linkList;
while (curr != null) {
stringBuffer.append(curr.node);
curr = curr.next;
}
System.out.println(stringBuffer.toString());
}
public static void main(String[] args) {
LinkList linkList = new LinkList(2);
LinkList newNode = new LinkList(1);
linkList.next = newNode;
LinkList newNode1 = new LinkList(1);
Lc_LRU lc_lru = new Lc_LRU();
linkList = lc_lru.insert(newNode1, linkList);
lc_lru.sysoLinkList(linkList);
}
}
不恋尘世浮华,不写红尘纷扰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理