package com.johnChnia.coding2017.basic.linklist;
/**
* Created by john on 2017/4/6.
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {
}
}
private int capacity;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中的对象
*
* @param pageNum 对象值
*/
public void access(int pageNum) {
if (first == null) {
Node node = createNode(pageNum);
first = last = node;
capacity--;
} else if (getNode(pageNum) == null) {
if (capacity == 0) {
Node lastNode = first;
while (lastNode.next != null) {
lastNode = lastNode.next;
}
lastNode.prev.next = null;
last = lastNode.prev;
delete(lastNode);
capacity++;
}
Node node = createNode(pageNum);
node.next = first;
node.prev = null;
first.prev = node;
first = node;
capacity--;
} else {
if (first.pageNum != pageNum) {
Node node = getNode(pageNum);
if (node.next != null) {
node.prev.next = node.next;
node.next.prev = node.prev;
} else {
node.prev.next = null;
last = node.prev;
}
node.next = first;
node.prev = null;
first.prev = node;
first = node;
}
}
}
/**
* 删除节点
*/
private void delete(Node node) {
node.pageNum = 0;
node.next = null;
node.prev = null;
}
/**
* @param pageNum 页号
* @return 节点
*/
private Node createNode(int pageNum) {
Node node = new Node();
node.pageNum = pageNum;
node.next = null;
node.prev = null;
return node;
}
/**
* @param pageNum 页号
* @return 如果LRUPageFrame包含该pageNum就返回该节点,否则返回null
*/
private Node getNode(int pageNum) {
for (Node node = first; node != null; node = node.next) {
if (node.pageNum == pageNum) {
return node;
}
}
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();
}
}