package week04.lru;
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node(Node prev, Node next, int pageNum) {
this.prev = prev;
this.next = next;
this.pageNum = pageNum;
}
}
private int capacity;
private Node first;// 链表头
private Node last;// 链表尾
private int size; // 链表长度
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中对象
*
* @param key
* @return
*/
public void access(int pageNum) {
int index = find(pageNum);
if (size != 0) {
if(index >= 0){
remove(index);
}else if(size == capacity){
remove(size - 1);
}
}
addToHead(pageNum);
}
public void remove(int index) {
if (index == 0) {
if(size == 1){
first = last = null;
}else{
first = first.next;
first.prev = null;
}
} else if (index == (size - 1)) {
if(size == 1){
first = last = null;
}else{
last = last.prev;
last.next = null;
}
} else {
Node node = first;
for (int i = 1; i < index; i++) {
node = node.next;
}
Node nxt = node.next;
node.next = nxt.next;
(nxt.next).prev = node;
nxt = null;
}
size--;
}
public int find(int pageNum) {
int index = 0;
Node cur = first;
while (cur != null) {
if (pageNum == cur.pageNum) {
return index;
}
cur = cur.next;
index++;
}
return -1;
}
public void addToHead(int pageNum) {
// 链表为空
if (first == null) {
Node node = new Node(null, null, pageNum);
first = node;
last = node;
} else {
Node node = new Node(null,first,pageNum);
first.prev = node;
first = node;
}
size ++;
}
@Override
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();
}
}