package basic.LRU; /** * Created by zhouliang on 2017-04-04. */ public class MyLRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node() { } } private int capacity; private int currentSize; private Node first;// 链表头 private Node last;// 链表尾 public MyLRUPageFrame(int capacity) { this.currentSize = 0; this.capacity = capacity; } /** * 获取缓存中对象 * * @param pageNum * @return */ public void access(int pageNum) { //1、是否为空号 //2、不为空,查找后面有没有出现pageNum,如果出现则把pageNum结点移动到head //3、如果没有出现pageNum,则判断栈是否满 //4、如果栈没有满,则添加pageNum到head //5、否则删除最后一个再添加pageNum到head Node temp = find(pageNum); if (temp != null) { moveExistingNodeToHead(temp); } else { temp = new Node(); temp.pageNum = pageNum; if (currentSize >= capacity) { removeLast(); } addNewNodetoHead(temp); } } private void addNewNodetoHead(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; } currentSize++; } private Node find(int data) { if (isEmpty()) { return null; } else { Node temp = first; while (temp.next != null) { if (temp.pageNum == data) { return temp; } temp = temp.next; } return null; } } /** * 删除链表尾部节点 表示 删除最少使用的缓存对象 */ private void removeLast() { Node temp = last.prev; temp.next = null; last.prev = null; last = temp; currentSize--; } /** * 移动到链表头,表示这个节点是最新使用过的 */ private void moveExistingNodeToHead(Node node) { if(node == first){ return; } if(node != last){ Node prev = node.prev; Node next = node.next; prev.next = next; next.prev = prev; }else{ Node prev = node.prev; prev.next = null; last.prev = null; last = prev; } node.next = first; node.prev = null; first.prev = node; first = node; } private boolean isEmpty() { return (first == null) && (last == 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(); } }