lru算法c语言实现单链表,基于单链表实现LRU算法

本文介绍了使用链表实现LRU(Least Recently Used,最近最少使用)数据结构的方法,包括如何处理数据已存在和链表满时的插入策略。通过`SNode`类定义节点,并演示了删除、插入和查找操作。
摘要由CSDN通过智能技术生成

基本思路:

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;

}

}

复制代码

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值