package com.coding2017.basic.linklist;
/**
* 用双向链表实现LRU算法
*
* @author liuxin
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {
}
}
private int capacity;
private Node first;// 链表头
private Node last;// 链表尾
private int size = 0;
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中对象
*
* @param pageNum
* @return
*/
public void access(int pageNum) {
if (size < capacity) {
Node node = new Node();
node.pageNum = pageNum;
if (first == null && last == null) {
node.prev = null;
node.next = null;
first = node;
last = node;
} else {
if (last.prev == null) {
last.prev = node;
node.next = last;
} else {
assert first != null;
first.prev = node;
node.next = first;
}
node.prev = null;
first = node;
}
size++;
} else {
Node node = last;
while (node != null) {
if (pageNum == node.pageNum) {
Node temp = node;
if(node == last){
last = last.prev;
last.prev = temp.prev.prev;
last.next = null;
}else if(node == first){
first = temp.next;
first.prev = null;
first.next = temp.next.next;
}else{
node.next.prev = temp.prev;
node.prev.next = temp.next;
}
temp = null;
break;
}
node = node.prev;
}
if(node == null){
Node temp = last;
last = last.prev;
last.prev = temp.prev.prev;
last.next = null;
temp = null;
}
Node newNode = new Node();
newNode.pageNum = pageNum;
first.prev = newNode;
newNode.prev = null;
newNode.next = first;
first = newNode;
}
}
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();
}
}