package com.coding.week4.linklist;
/**
* 用双向链表实现LRU算法
* @author liuxin
*
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {
}
public Node(Node prev, int pageNum, Node next) {
this.prev = prev;
this.next = next;
this.pageNum = pageNum;
}
}
private int capacity;
private int size;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中对象
*
* @param
* @return
*/
public void access(int pageNum) {
if (!isFull()) {
addFirst(pageNum);
} else {
if (contains(pageNum)) {
removePage(pageNum);
addFirst(pageNum);
} else {
removeLast();
addFirst(pageNum);
}
}
}
public boolean contains(int pageNum) {
Node node = first;
if (first == null)
return false;
do {
if (pageNum == node.pageNum)
return true;
node = node.next;
} while (node != null );
return false;
}
public void addFirst(int pageNum){
Node node = new Node(null, pageNum, null);
if (first == null) {
first = node;
last = node;
} else {
Node oldFirst = first;
first = node;
node.next = oldFirst;
oldFirst.prev = node;
}
size++;
}
public boolean isFull () {
return size == capacity;
}
public void addLast(int pageNum) {
Node oldLast = last;
Node node = new Node(oldLast, pageNum, null);
oldLast.next = node;
last = node;
size++;
}
public int removeLast(){
Node oldLast = last;
last = oldLast.prev;
last.next = null;
size--;
return oldLast.pageNum;
}
public void removePage(int pageNum){
Node node = first;
if (first == null) {
return;
}
do {
if (node.pageNum == pageNum) {
if (node == first) {
removeFirst();
} else if (node == last) {
removeLast();
} else {
Node pre = node.prev;
Node nex = node.next;
pre.next = nex;
nex.prev = pre;
size--;
}
return;
}
node = node.next;
} while (node != null);
}
private void removeFirst() {
Node node = first;
first = node.next;
first.prev = null;
node.next = null;
size--;
}
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();
}
}