package com.coding.basic.linklist;
/**
* 用双向链表实现LRU算法
* @author liuxin
*
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {
}
}
private int capacity;
private int curreantSize;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(){
this.first = null;
this.last = first;
}
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
/**
* 获取缓存中对象
*
* @param key
* @return
*/
public void access(int pageNum) {
Node node = find(pageNum);
//在该队列中存在
if(node!= null){
moveExistingNodeToHead(node);
}
else{
node = new Node();
node.pageNum = pageNum;
//缓存容器是否已经超过大小
if(curreantSize>=capacity){
removeLast();
}
addNewNodeAtHead(node);
}
}
private void moveExistingNodeToHead(Node node) {
if(first.pageNum == node.pageNum ){
return;
}else if(last.pageNum == node.pageNum) {
Node lastToHead = last;
last = last.prev;
last.next = null;
lastToHead.prev = null;
lastToHead.next = first;
first.prev = lastToHead;
first = lastToHead;
}else {
Node MiddleNode = first.next;
first.next = last;
last.prev = first;
MiddleNode.next = first;
MiddleNode.prev = null;
first.prev = MiddleNode;
first = MiddleNode;
}
}
private void addNewNodeAtHead(Node node) {
if(isEmpty()){
node.prev = null;
node.next = null;
first = node;
last = node;
}else{
node.prev = null;
node.next =first;
first.prev = node;
first = node;
}
curreantSize++;
}
private boolean isEmpty() {
// TODO Auto-generated method stub
return (curreantSize==0);
}
private void removeLast() {
Node prev = last.prev;
prev.next = null;
last.prev = null;
last = prev ;
this.curreantSize--;
}
private Node find(int pageNum) {
Node node = first;
while(node!=null){
if(node.pageNum==pageNum){
return node;
}
node = node.next;
}
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();
}
}