lru算法 java 链表_Java-双向链表实现LRU算法

public classLRUPageFrame {private static classNode {

Node prev;

Node next;intpageNum;

Node() {

}

}private intcapacity;private intcurrentSize;private Node first;//链表头

private Node last;//链表尾

public LRUPageFrame(intcapacity) {this.currentSize = 0;this.capacity =capacity;

}/*** 获取缓存中对象

*

*@paramkey

*@return

*/

public void access(intpageNum) {

Node node=find(pageNum);//在该队列中存在, 则提到队列头

if (node != null) {

moveExistingNodeToHead(node);

}else{

node= newNode();

node.pageNum=pageNum;//缓存容器是否已经超过大小.

if (currentSize >=capacity) {

removeLast();

}

addNewNodetoHead(node);

}

}private voidaddNewNodetoHead(Node node) {if(isEmpty()){

node.prev= null;

node.next= null;

first=node;

last=node;

}else{

node.prev= null;

node.next=first;

first.prev=node;

first=node;

}this.currentSize ++;

}private Node find(intdata){

Node node=first;while(node != null){if(node.pageNum ==data){returnnode;

}

node=node.next;

}return null;

}/*** 删除链表尾部节点 表示 删除最少使用的缓存对象*/

private voidremoveLast() {

Node prev=last.prev;

prev.next= null;

last.prev= null;

last=prev;this.currentSize --;

}/*** 移动到链表头,表示这个节点是最新使用过的

*

*@paramnode*/

private voidmoveExistingNodeToHead(Node node) {if (node ==first) {return;

}else if(node ==last){//当前节点是链表尾, 需要放到链表头

Node prevNode =node.prev;

prevNode.next= null;

last.prev= null;

last=prevNode;

}else{//node 在链表的中间, 把node 的前后节点连接起来

Node prevNode =node.prev;

prevNode.next=node.next;

Node nextNode=node.next;

nextNode.prev=prevNode;

}

node.prev= null;

node.next=first;

first.prev=node;

first=node;

}private booleanisEmpty(){return (first == null) && (last == null);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值