package main;
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {
}
}
private int capacity;
private int currentSize;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
this.currentSize = 0;
}
/**
* 获取缓存中的对象
*
* @param pageNum
*/
public void access(int pageNum) {
if (first == null && last == null) {
first = new Node();
first.pageNum = pageNum;
last = first;
currentSize++;
return;
}
Node tagNode = find(pageNum);
if (tagNode != null) {
moveExistingNodeToHead(tagNode);
return;
}
Node node = new Node();
node.pageNum = pageNum;
addNewNodeToHead(node);
}
private void addNewNodeToHead(Node node) {
if (currentSize == capacity) {
removeLast();
}
Node temp = first;
temp.prev = node;
node.next = temp;
first = node;
currentSize++;
}
private Node find(int data) {
Node node = first;
while (node != null) {
if (node.pageNum == data) {
return node;
}
node = node.next;
}
return null;
}
/**
* 删除链表尾部节点,表示删除最小使用的缓存对象
*/
private void removeLast() {
Node temp = last.prev;
temp.next = null;
last = temp;
currentSize--;
}
/**
* 移动到表头,表示这个节点是最新使用过的
*/
private void moveExistingNodeToHead(Node node) {
if (node.prev == null) {
return;
}
Node prev = node.prev;
Node next = node.next;
if (next == null) {
last = prev;
}
prev.next = next;
if (next != null) {
next.prev = prev;
}
Node temp = first;
temp.prev = node;
node.prev = null;
node.next = temp;
first = node;
}
public String toString() {
StringBuilder sb = new StringBuilder();
Node node = first;
while (node != null) {
sb.append(node.pageNum);
node = node.next;
if (node != null) {
sb.append(",");
}
}
return sb.toString();
}
}