package org.wsc.coding.basic.linklist;
/**
* <h3>LRU算法</h3>
* <p>
* 最近最少使用
* </p>
*
* @author Administrator
* @date 2017年3月28日上午10:56:33
* @version v1.0
*
*/
public class LRUPageFrame {
private static class Node {
Node prev;
int pageNum;
Node next;
Node() {
}
Node(Node prev, int pageNum, Node next) {
super();
this.prev = prev;
this.pageNum = pageNum;
this.next = next;
}
}
private int capacity;
private Node first;// 链表头
private Node last;// 链表尾
private int size;// 长度
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中对象
*
* @param key
* @return
*/
public void access(int pageNum) {
// 首先检查链表中是否已存在改页码
Node node = find(pageNum);
if (node == null) {
// 满则删除尾部后插入
if (isFull())
unlinkLast();
put(pageNum);
} else {
Node prev = node.prev;
Node next = node.next;
Node oldFirst = first;
if(prev != null){
first = node;
prev.next = next;
node.prev = null;
node.next = oldFirst;
oldFirst.prev = node;
if(next == null)
last = prev;
else
next.prev = prev;
}
}
}
/**
* 添加至头节点
*
* @param pageNum
*/
void put(int pageNum) {
Node oldFirst = first;
Node newNode = new Node(null, pageNum, oldFirst);
first = newNode;
if (oldFirst == null) {
last = newNode;
} else {
oldFirst.prev = newNode;
}
size++;
}
/**
* 删除尾节点
*/
void unlinkLast() {
Node oldLast = last;
Node prev = oldLast.prev;
if (oldLast != null) {
if (prev == null)
first = null;
else {
prev.next = null;
}
last = prev;
}
size--;
}
Node find(int pageNum) {
Node node = last;
while (node != null) {
if (node.pageNum == pageNum)
return node;
node = node.prev;
}
return node;
}
boolean isFull() {
return size == capacity ? true : false;
}
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();
}
}