基本思路:

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算法相关推荐

  1. 单像素骨架提取算法c语言实现,【图像】骨架提取与分水岭算法

    1.骨架提取 骨架提取,也叫二值图像细化.这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示. morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize ...

  2. dbscan算法中 参数的意义_基于变参数的DBSCAN算法

    安全模型.算法与编程 |34| 基于变参数的 DBSCAN 算法 ◆付泽强 王晓锋 (江南大学物联网工程学院 江苏 214122) 摘要:DBSCAN 算法是一种常用的基于密度的聚类算法,其优点在于性 ...

  3. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc

    图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...

  4. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言)

    图的邻接表实现迪杰斯特拉算法(C语言). 迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题. 图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是 ...

  5. java图像检索的算法_图像检索:几种基于纹理特征的图像检索算法

    本文节选自<基于纹理的图像检索算法研究>.描述了几种基于纹理特征的图像检索算法. 第 3 章基于纹理特征的图像检索 3.2 基于灰度共生矩阵的纹理分析法 灰度共生矩阵是分析纹理特征的一种有 ...

  6. 【c语言课程设计】基于单链表与结构体的学生奖学金评定系统(菜单操作)

    编写C程序,实现以下功能: 1)每名学生信息包括:学号(8个字符).姓名(最多20个字符).5门课程成绩(整型).总成绩(整型). 2)声明结构体类型用以保存学生信息. 3)从键盘读入全班同学的信息( ...

  7. 活性边表算法c语言,《计算机图形学》有序边表填充算法.doc

    PAGE PAGE 8 实 验 报 告 实验目的 掌握有序边表算法填充多边形区域: 理解多边形填充算法的意义: 增强C语言编程能力. 算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点 ...

  8. sunday算法c语言实现,C / C++学习笔记:实现Sunday算法

    Sunday算法 Sunday 算法于 1990 年 Daniel M.Sunday 提出的字符串模式匹配.其效率在匹配随机的字符串时比其他匹配算法还要更快.Sunday 算法的实现可比 KMP,BM ...

  9. python实现面部特效_【AI美颜算法】300行Python实现基于人脸特征的美颜算法

    先上效果图: AI美颜 人类一直是一个看脸的物种,人人都希望可以变得更美是无可争议的,而美颜类应用的出现拯救了所有人,从此人类进入了美(照)颜(骗)时代. .... 每次写技术blog都要写一堆废话引 ...

最新文章

  1. 美团五大最受欢迎的开源项目!
  2. KBMMW 4.80.00 发布
  3. VS2015--win32project配置的一些想法之在 Visual Studio 2015 中进行调试的同一时候分析性能...
  4. git锁和钩子以及图形化界面
  5. 《Python游戏编程入门》——1.2 初识Python
  6. Android的十六进制颜色值
  7. 三只松鼠现“两只老鼠”:卖废纸箱发家致富??
  8. 关于Mysql group_concat的应用(把相同ID的VAL用字符'/'连接起来)
  9. 解决办法:undefined reference to symbol '_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
  10. unity3D跑酷游戏源码,支持安卓+IOS双端 unity2019 C#语言开发
  11. 基于物联网技术的3DGIS智慧园区信息系统研究
  12. 计算机护眼模式怎么设置的,教你如何开启电脑的护眼模式
  13. 路由器上端口转发_如何在路由器上转发端口
  14. 活码二维码(动态二维码)域名池介绍
  15. 【湍流】基于matlab kolmogorov结合次谐波补偿大气湍流相位屏【含Matlab源码 2178期】
  16. 华为手机便捷好用的原因,终于被我找到了
  17. XJOI 循环-分解质因式
  18. 最经典的企业管理书籍推荐,这个系列的书可以帮助管理者实现个人能力提升
  19. Winform开发框架之介绍
  20. 断言assert的理解和用法

热门文章

  1. 微课|中学生可以这样学Python(例3.2):今天是今年的第几天
  2. Python批量生成垃圾邮件内容
  3. Python编程常见出错信息及原因分析(4)
  4. java 获取数据源_J2EE java 获取数据源
  5. 下列计算机设备中运行最慢的是,下列4种存储设备中,读写速度最慢的是( )。A.内存条B.硬盘C. CPU内部寄存器D. Cache - 试题答案网问答...
  6. byteofpython.info_A Byte of Python 笔记(7)数据结构:列表、元组、字典,序列
  7. android输入流,android – 获取图像输入流的大小
  8. php recordarray,php5.5新数组函数array-column使用实例
  9. oracle 空值的排序问题 (转载),sqlserver、oracle数据库排序空值null问题解决办法
  10. appscan如何进行web端安全性测试_常用的软件测试工具有哪些?