package week04.lru;
/**
* 用双向链表实现LRU算法
* @author Hui Zhou
*
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node(int pageNum) {
this.pageNum = pageNum;
}
}
private int capacity;
private int size;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中对象
*
* @param key
* @return
*/
public void access(int pageNum) {
Node node = new Node(pageNum);
if(first == null){
init(node);
}
else if(size == capacity){
if(node.pageNum == first.pageNum){
return;
}
else if(node.pageNum == first.next.pageNum){
insertOfMidEqual(node);
}
else if(node.pageNum == last.pageNum){
insert(node);
}
else{
insert(node);
}
}
else{
addNode(node);
}
}
private void init(Node node) {
first = node;
last = first;
size++;
}
private void addNode(Node node) {
node.next = first;
first.prev = node;
first = node;
size++;
}
private void insert(Node node) {
last = first.next;
last.next = null;
node.next = first;
first.prev = node;
first = node;
}
private void insertOfMidEqual(Node node) {
first.next = last;
last.prev = first;
node.next = first;
first.prev = node;
first = node;
}
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();
}
}