使用单链表实现LRU(Least Recently Used)淘汰缓存机制

需求:存在一个单链表,在单链表尾部的都是越早之前添加的元素。

  1. 当元素被访问到时,会添加进缓存(也就是这个单链表中)。
  2. 如果这个元素在之前已经被缓存到了链表中,则将这个元素从原来的位置删除,用头插法放到链表的头部。
  3. 如果这个元素不在链表中,则根据链表的容量进行判断
    1. 缓存容量未满时,直接用头插法,放到链表的头部
    2. 缓存容量已满时,首先删除链表尾部的元素,再将元素进行插入到头部。

创建Node对象

package com.codezs.datastruct.mylinkedlist;

public class Node<T> {
T data;
Node<T> next; Node(Node<T> next) {
this.next = next;
} public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
} public T getData(){
return data;
}
public Node<T> getNext(){
return next;
}
public void setNext(Node<T> next){this.next = next;}; }

对单链表实现LRU淘汰缓存机制的实现

package com.codezs.datastruct.mylinkedlist;

public class MyLinkedList<T> {

    //默认链表容量
private final static Integer DEFAULT_CAPACITY = 10; //头结点
private Node head; //链表长度
private Integer length; //链表容量
private Integer capacity; public MyLinkedList() {
this.capacity = DEFAULT_CAPACITY;
this.head = new Node(null);
this.length = 0;
} public MyLinkedList(Integer capacity) {
this.capacity = capacity;
this.head = new Node(null);
this.length = 0;
} public Node getHead(){
return head;
} //添加新的元素
public void add(T data){
Node<T> preNode = findPreNode(data); if (preNode != null){
remove(preNode);
insertNode(data);
} else {
if (length >= this.capacity){
deleteNodeAtEnd();
}
insertNode(data);
}
} //获取查找到元素的前一个节点
private Node<T> findPreNode(T data){
Node node = head;
while(node.getNext() != null){
if (data.equals(node.getNext().getData())){
return node;
}
node = node.getNext();
}
return null;
} //删除node结点下一个元素
private void remove(Node preNode){
Node node = preNode.getNext();
preNode.setNext(node.getNext());
node = null;
length--;
} //头插法
private void insertNode(T data){
Node node = head.getNext();
head.setNext(new Node(data,node));
length++;
} //删除链表中最后一个元素
private void deleteNodeAtEnd(){
Node node = head; if (node.getNext() == null) {
return;
} while (node.getNext().getNext() != null) {
node = node.getNext();
}
Node nextNode = node.getNext();
node.setNext(null);
nextNode = null;
length--;
} public boolean isEmpty(){
return length == 0;
} public int size(){
return length;
} }

重学数据结构(三)——使用单链表实现LRU淘汰缓存机制的更多相关文章

  1. 数据结构——Java实现单链表

    一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...

  2. js数据结构与算法--单链表的实现与应用思考

    链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...

  3. PHP数据结构之实现单链表

    学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...

  4. 经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等

    参考文章: 判断链表是否相交:http://treemanfm.iteye.com/blog/2044196 一.单链表反转 链表节点 public class Node { private int ...

  5. C++ 数据结构学习二(单链表)

    模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespa ...

  6. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

  7. 重学数据结构系列之——平衡树之SB Tree(Size Blanced Tree)

    学习来源:计蒜客 平衡树 1.定义 对于每一个结点.左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1 为什么会出现这样一种树呢? 假如我们依照1-n的顺序插入到二叉排序树中,那么二叉排序树就 ...

  8. 重学STM32---(三) 中断分组和优先级

    看了大半天,终于把原子哥的例程中的中断分组和优先级看懂了,勉勉强强知道了怎么设置中断分组和优先级,,不容易啊.下面就是我收集的资料及我的理解 分组不是很难,就是有一点知道就就全部明白了: // 设置N ...

  9. 数据结构-多级指针单链表(C语言)

    偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...

随机推荐

  1. git常用命令(部分)

    git常用命令 1.git init 初始化一个新本地仓库,它在工作目录下生成一个名为.git的隐藏文件夹. 安装好git的,新建一个文件夹,在空文件夹中鼠标右击点击Git Bash Here 2.g ...

  2. Flask01-HelloWorld

    # flask学习 参考:http://www.pythondoc.com/flask-mega-tutorial/ ## python3. 默认支持虚拟环境使用(用最简单的方法,解决问题) wget ...

  3. 分享 HT 实用技巧:实现指南针和 3D 魔方导航

    前言 三维场景时常需要一个导航标识,用来确定场景所处的方位. 一般有两种表现形式:指南针.小方盒(方位魔方). 参考一下百度百科中的 maya 界面,可以看到右上角有一个标识方位的小盒子,说的就是它: ...

  4. 07 . Kubernetes之Service

    kubernetes有三种网络 1. Node Network 2. Pod Network 3. Cluster Network Service-网络代理模式 **userspce: 1.1- ** ...

  5. MyBatis执行流程的各阶段介绍

    目录 一.mybatis极简示例 1.1 创建mybatis配置文件 1.2 创建数据库表 1.3 创建javabean 1.4 创建mapper映射文件 1.5 运行测试 二.mybatis的几大“ ...

  6. CSS position 属性_css中常用position定位属性介绍

    css可以通过为元素设置一个position属性值,从而达到将不同的元素显示在不同的位置, position定位是指定位置的定位,以下为常用的几种: 1.static(静态定位): 这个是元素的默认定 ...

  7. 什么是DevOps?该如何正确的在企业内进行实践

    传统IT技术团队中通常都有多个独立的组织-开发团队.测试团队和运维团队.开发团队进行软件开发.测试团队进行软件测试,运维团队致力于部署,负载平衡和发布管理. 他们之间的职能有时重叠.有时依赖.有时候会 ...

  8. 区间dp(能量项链)

    [题目大意] 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记 ...

  9. POJ3040贪心

    题意:作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴.FJ有一套硬币N种(1≤N≤20)不同的面额,每枚硬币是所有比他小的硬币面值的倍数,例如1美分硬币.5美分硬币. ...

  10. Django---进阶7

    目录 图书管理的图书增删改查 choices参数(数据库字段设计常见) MTV与MVC模型 多对多三种创建方式 Ajax 小例子 作业 图书管理的图书增删改查 from django.shortcut ...