package linkedList;
import java.util.Scanner;
/**
* @program: DataStructureandAlgorithm
* @description: 基于单链表实现LRU算法
* @author: Mr.Wang
* @create: 2019-01-23-20:39
**/
public class LRUBaseLinkedList<T> {
/**
* 默认链表容量
*/
private final static Integer DEFAULT_CAPACITY = 10;
/**
* 头结点
*/
private SNode<T> 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);
insertElemAtBegin(data);
} else{
if (length >= this.capacity){
//删除尾节点
deleteElemAtEnd();
}
insertElemAtBegin(data);
}
}
/**
* 删除preNode节点下一个元素
*
* @param preNode
*/
private void deleteElemOptim(SNode 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().getNext() != null){
ptr = ptr.getNext();
}
SNode temp = ptr.getNext();
ptr.setNext(null);
temp = null;
length--;
}
private void printAll(){
SNode node = headNode.getNext();
while(node != null){
System.out.print(node.getElement() + ",");
node = node.getNext();
}
System.out.println();
}
public class SNode<T>{
private T element;
private SNode next;
public SNode(T element){
this.element = element;
}
public SNode(T element, SNode next){
this.element = element;
this.next = next;
}
public 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;
}
}
public static void main(String[] args){
LRUBaseLinkedList list = new LRUBaseLinkedList();
Scanner sc = new Scanner(System.in);
while (true){
list.add(sc.nextInt());
list.printAll();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
数据结构与算法练习题.zip (15个子文件)
open_suanfayushujujiegouxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxcxvcvcv
DataStructureandAlgorithm.iml 423B
src
stack
StackBasedLinkedList.java 2KB
linkedList
FindkthToTail.java 2KB
LRUBaseLinkedList.java 4KB
ReverseSingleLinkedList.java 3KB
SingleLinkedList.java 621B
queue
QueueBaseOnLinkedList.java 2KB
CircularQueue.java 1KB
ArrayQueue.java 2KB
recursion
TiaoTaijie.java 987B
.idea
fileTemplates
internal
Class.java 273B
uiDesigner.xml 9KB
misc.xml 273B
inspectionProfiles
Project_Default.xml 1KB
modules.xml 290B
共 15 条
- 1
资源评论
极致人生-010
- 粉丝: 2910
- 资源: 2826
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
- python中matplotlib教程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功