lru算法c语言实现单链表,基于单链表实现LRU算法
基本思路:
1.如果数据已经在链表中已经存在了,则直接删除原数据,再插入头结点
2.若链表中不在:
2.1 若链表容量未满,则直接插入头结点
2.2 若链表容量已满,则先删除尾结点,再插入头结点
代码如下:
public class LRUBaseLinkedList {
/**
* 默认链表容量
*/
private final static Integer DEFAULT_CAPACITY=10;
/**
* 头结点
*/
private SNode headNode;
/**
* 链表长度
*/
private Integer length;
/**
* 链表容量
*/
private Integer capacity;
public LRUBaseLinkedList(){
this.headNode=new SNode<>();
this.capacity=DEFAULT_CAPACITY;
this.length=0;
}
public LRUBaseLinkedList(Integer capacity){
this.headNode=new SNode<>();
this.capacity=capacity;
this.length=0;
}
public void add(T data){
SNode preNode=findPreNode(data);
//链表中已经存在,则删除原数据,插入头结点
if(preNode!=null){
deleteElemOptim(preNode);
}else{
//链表中不存在则直接插入,若超出容量,则删除尾结点
if(length>=this.capacity){
deleteElemAtEnd();
}
}
insertElemAtBegin(data);
}
/**
* 删除preNode结点下一个元素
* @param preNode
*/
private void deleteElemOptim(SNode preNode){
//讲preNode后继指针替换
SNode temp=preNode.getNext();
preNode.setNext(temp.getNext());
temp=null;
length--;
}
/**
* 在链表头结点插入元素
* @param data
*/
private void insertElemAtBegin(T data){
SNode next=headNode.getNext();
headNode.setNext(new SNode(data,next));
length++;
}
/**
* 获取查找元素的前一个结点
* @param data
* @return
*/
private SNode findPreNode(T data){
SNode node=headNode;
while(node.getNext()!=null){
if(data.equals(node.getNext().getElement())){
return node;
}
node=node.getNext();
}
return null;
}
/**
* 删除尾结点
*/
private void deleteElemAtEnd(){
SNode ptr=headNode;
//空链表直接返回
if(ptr.getNext()==null){
return;
}
//倒数第二个结点
while(ptr.getNext()!=null){
ptr=ptr.getNext();
}
SNode tmp=ptr.getNext();
ptr.setNext(null);
tmp=null;
length--;
}
private static class SNode{
/**
* 结点
*/
T element;
/**
* 后继指针
*/
SNode next;
SNode(T element){
this.element=element;
}
SNode(T element,SNode next){
this.element=element;
this.next=next;
}
SNode(){
this.next=null;
}
public T getElement() {
return element;
}
public void setElement(T element) {
this.element = element;
}
public SNode getNext() {
return next;
}
public void setNext(SNode next) {
this.next = next;
}
}
复制代码
}
lru算法c语言实现单链表,基于单链表实现LRU算法相关推荐
- 单像素骨架提取算法c语言实现,【图像】骨架提取与分水岭算法
1.骨架提取 骨架提取,也叫二值图像细化.这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示. morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize ...
- dbscan算法中 参数的意义_基于变参数的DBSCAN算法
安全模型.算法与编程 |34| 基于变参数的 DBSCAN 算法 ◆付泽强 王晓锋 (江南大学物联网工程学院 江苏 214122) 摘要:DBSCAN 算法是一种常用的基于密度的聚类算法,其优点在于性 ...
- 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc
图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...
- 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言)
图的邻接表实现迪杰斯特拉算法(C语言). 迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题. 图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是 ...
- java图像检索的算法_图像检索:几种基于纹理特征的图像检索算法
本文节选自<基于纹理的图像检索算法研究>.描述了几种基于纹理特征的图像检索算法. 第 3 章基于纹理特征的图像检索 3.2 基于灰度共生矩阵的纹理分析法 灰度共生矩阵是分析纹理特征的一种有 ...
- 【c语言课程设计】基于单链表与结构体的学生奖学金评定系统(菜单操作)
编写C程序,实现以下功能: 1)每名学生信息包括:学号(8个字符).姓名(最多20个字符).5门课程成绩(整型).总成绩(整型). 2)声明结构体类型用以保存学生信息. 3)从键盘读入全班同学的信息( ...
- 活性边表算法c语言,《计算机图形学》有序边表填充算法.doc
PAGE PAGE 8 实 验 报 告 实验目的 掌握有序边表算法填充多边形区域: 理解多边形填充算法的意义: 增强C语言编程能力. 算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点 ...
- sunday算法c语言实现,C / C++学习笔记:实现Sunday算法
Sunday算法 Sunday 算法于 1990 年 Daniel M.Sunday 提出的字符串模式匹配.其效率在匹配随机的字符串时比其他匹配算法还要更快.Sunday 算法的实现可比 KMP,BM ...
- python实现面部特效_【AI美颜算法】300行Python实现基于人脸特征的美颜算法
先上效果图: AI美颜 人类一直是一个看脸的物种,人人都希望可以变得更美是无可争议的,而美颜类应用的出现拯救了所有人,从此人类进入了美(照)颜(骗)时代. .... 每次写技术blog都要写一堆废话引 ...
最新文章
- 美团五大最受欢迎的开源项目!
- KBMMW 4.80.00 发布
- VS2015--win32project配置的一些想法之在 Visual Studio 2015 中进行调试的同一时候分析性能...
- git锁和钩子以及图形化界面
- 《Python游戏编程入门》——1.2 初识Python
- Android的十六进制颜色值
- 三只松鼠现“两只老鼠”:卖废纸箱发家致富??
- 关于Mysql group_concat的应用(把相同ID的VAL用字符'/'连接起来)
- 解决办法:undefined reference to symbol '_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
- unity3D跑酷游戏源码,支持安卓+IOS双端 unity2019 C#语言开发
- 基于物联网技术的3DGIS智慧园区信息系统研究
- 计算机护眼模式怎么设置的,教你如何开启电脑的护眼模式
- 路由器上端口转发_如何在路由器上转发端口
- 活码二维码(动态二维码)域名池介绍
- 【湍流】基于matlab kolmogorov结合次谐波补偿大气湍流相位屏【含Matlab源码 2178期】
- 华为手机便捷好用的原因,终于被我找到了
- XJOI 循环-分解质因式
- 最经典的企业管理书籍推荐,这个系列的书可以帮助管理者实现个人能力提升
- Winform开发框架之介绍
- 断言assert的理解和用法
热门文章
- 微课|中学生可以这样学Python(例3.2):今天是今年的第几天
- Python批量生成垃圾邮件内容
- Python编程常见出错信息及原因分析(4)
- java 获取数据源_J2EE java 获取数据源
- 下列计算机设备中运行最慢的是,下列4种存储设备中,读写速度最慢的是( )。A.内存条B.硬盘C. CPU内部寄存器D. Cache - 试题答案网问答...
- byteofpython.info_A Byte of Python 笔记(7)数据结构:列表、元组、字典,序列
- android输入流,android – 获取图像输入流的大小
- php recordarray,php5.5新数组函数array-column使用实例
- oracle 空值的排序问题 (转载),sqlserver、oracle数据库排序空值null问题解决办法
- appscan如何进行web端安全性测试_常用的软件测试工具有哪些?