package com.coding.basic.linklist;
/**
* 用双向链表实现LRU算法
* @author songbao.yang
*
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {
}
}
private int capacity;
private int size;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
this.size = 0;
first = null;
last = null;
}
/**
* 获取缓存中对象
*
* @param pageNum
* @return
*/
public void access(int pageNum) {
Node newNode = new Node();
newNode.pageNum = pageNum;
//往链表头部加入元素
if (size == 0){
first = newNode;
last = newNode;
} else {
newNode.next = first;
if (first == null){
System.out.println("fuck");
}
first.prev = newNode;
first = newNode;
}
size++;
//去重
Node node = first.next;
while (node != null){
if (node.pageNum == pageNum){
node.prev.next = node.next;
if (node == last){
last = node.prev;
} else {
node.next.prev = node.prev;
}
Node tmp = node;
node = node.next;
tmp.next = null;
tmp.prev = null;
size--;
} else {
node = node.next;
}
}
//调整容量
if (size > capacity){
last = last.prev;
last.next.prev = null;
last.next = null;
size--;
}
}
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();
}
}