package list;
/**
* @author jiaxun
*/
public class LRUPageFrame {
private int capacity;
private Node first;
private Node last;
private int size = 0;
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
public void access(int pageNum) {
if (size < capacity) {
addFirst(pageNum);
} else {
Node node = searchNode(pageNum);
if (node == null) {
removeLast();
addFirst(pageNum);
} else {
if (node.getData() == first.getData()) return;
if (node.getData() == last.getData()) {
last = node.getPrev();
node.getPrev().setNext(null);
node.setPrev(null);
node.setNext(first);
first.setPrev(node);
first = node;
} else {
node.getPrev().setNext(node.getNext());
node.getNext().setPrev(node.getPrev());
node.setNext(first);
node.setPrev(null);
first = node;
}
}
}
}
public Node searchNode(int pageNum) {
Node curr = first;
while (curr != null) {
if (curr.getData() == pageNum) {
return curr;
}
curr = curr.getNext();
}
return null;
}
public void addFirst(int data) {
Node node = new Node(data);
if (first == null) {
first = node;
} else if (last == null) {
last = first;
first = node;
first.setNext(last);
last.setPrev(first);
} else {
node.setNext(first);
first.setPrev(node);
first = node;
}
size++;
}
public void addLast(int data) {
Node node = new Node(data);
if (first == null) {
first = node;
} else if (last == null) {
last = node;
first.setNext(last);
last.setPrev(first);
} else {
node.setPrev(last);
last.setNext(node);
last = node;
}
size++;
}
public void removeLast() {
if (last != null && last.getPrev() != null) {
Node prev = last.getPrev();
last.getPrev().setNext(null);
last = prev.getData() == first.getData() ? null : last.getPrev();
} else if (first != null) {
first = null;
}
if (size > 0) {
size--;
}
}
public int size() {
return size;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
Node curr = first;
while (curr != null) {
builder.append(curr.getData());
if (curr.getNext() != null) {
builder.append(",");
}
curr = curr.getNext();
}
return builder.toString();
}
private static class Node {
private int data;
private Node prev;
private Node next;
public Node(int data) {
this.data = data;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getPrev() {
return prev;
}
public void setPrev(Node prev) {
this.prev = prev;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
@Override
public String toString() {
return "[data is " + data + "]";
}
}
}