package task4.lru;
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {
}
public Node(Node prev, Node next, int pageNum) {
this.prev = prev;
this.next = next;
this.pageNum = pageNum;
}
}
private int capacity;
private int size = 0;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中对象
*/
public void access(int pageNum) {
if (size == 0) {
last = first = new Node(first, last, pageNum);
// last = new Node(first, null, pageNum);
size++;
} else if (size > 0 && size < capacity) {
Node _node = get(pageNum);
if (_node == null) {
Node newNode = new Node(null, first, pageNum);
first.prev = newNode;
first = newNode;
clear();
size++;
} else {
exchange(_node);
}
} else {
Node _node = get(pageNum);
if (_node == null) {
last = last.prev;
Node newNode = new Node(null, first, pageNum);
first.prev = newNode;
first = newNode;
clear();
} else exchange(_node);
}
}
private void exchange(Node node) {
Node nextNode = node.next;
Node prevNode = node.prev;
if (prevNode == null)
return;//头部的话什么都不用做
if (nextNode != null) {
nextNode.prev = prevNode;
prevNode.next = nextNode;
last = getLast(nextNode);
} else {
last = prevNode;
}
first.prev = node;
node.next = first;
first = node;
clear();
}
private void clear() {
last.next = null;
first.prev = null;
}
private Node getLast(Node startNode) {
Node currentNode = startNode;
while (currentNode.next != null) {
currentNode = currentNode.next;
}
return currentNode;
}
private Node get(int pageNum) {
Node currentNode = last;
for (int i = 0; i < size; i++) {
if (pageNum == currentNode.pageNum) {
return currentNode;
}
currentNode = currentNode.prev;
}
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();
}
}