package com.coding.basic.linklist;
import sun.security.krb5.internal.PAData;
/**
* 用双向链表实现LRU算法
* @author liuxin
*
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node(int pageNum,Node p,Node n) {
this.pageNum= pageNum;
this.prev = p;
this.next = n;
}
}
private int capacity;
private int size=0;//节点个数
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中对象
*
* @param
* @return
*/
public void access(int pageNum) {
if (size<capacity) {
if (size == 0) {
first = new Node(pageNum,null,null);
size++;
} else if (size == 1) {
Node newnode=new Node(pageNum,null,first);
last = first;
first = newnode;
last.prev = first;
size++;
} else {
Node newnode = new Node(pageNum, null, first);
first.prev = newnode;
first = newnode;
size++;
}
}else {
if(queryis(pageNum) !=null){
Node denode = queryis(pageNum);
Node newfirst = new Node(pageNum,null,first);
first.prev = newfirst;
first = newfirst;
if(denode.next!=null){
denode.prev.next = denode.next;
denode.next.prev = denode.prev;
}else {
denode.prev.next = null;
last = denode.prev;
}
}else {
Node newfirst = new Node(pageNum, null, first);
first.prev = newfirst;
first = newfirst;
last = last.prev;
last.next = null;
}
}
}
public Node queryis(int pageNum) {
Node node = first;
boolean flag=false;
while (node != null) {
if (node.pageNum == pageNum) {
flag = true;
break;
}else {
node = node.next;
}
}
if (flag) {
return node;
} else {
return null;
}
}
public String toString(){
StringBuilder buffer = new StringBuilder();
Node node = first;
while(node != null){
buffer.append(node.pageNum);
node = node.next;
if(node != null){
buffer.append(",");
}
}
return buffer.toString();
}
}