package com.dudy.learn01.data_structure.list; public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node() { } } private int capacity; private int currentSize; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.currentSize = 0; this.capacity = capacity; } /** * 获取缓存中对象 * * @param key * @return */ public void access(int pageNum) { Node node = find(pageNum); if (node != null) { moveNodeToHead(node); } else { node = new Node(); node.pageNum = pageNum; // 缓存容器是否已满 if (currentSize >= capacity) { removeLastNode(); } addNewNodeToHeader(node); } } private void addNewNodeToHeader(Node node) { // TODO Auto-generated method stub if (first == null) { first = node; last = node; currentSize++; return; } node.next = first; if(first.next == null){ last.prev = node; } else { first.prev = node; } first = node; currentSize++; } private void removeLastNode() { // TODO Auto-generated method stub last.prev.next = null; last = last.prev; currentSize--; } private void moveNodeToHead(Node node) { if(first.pageNum == node.pageNum){ return; } if(last.pageNum == node.pageNum){ Node pLast = last.prev; pLast.next = null; last.next = first; last.prev = null; first.prev = last; first = last; last = pLast; return; } node.prev.next = node.next; node.next.prev = node.prev; node.prev = null; node.next = first; first.prev = node; first = node; } private Node find(int pageNum) { Node n = first; for (int i = 0; i < currentSize; i++) { if (n.pageNum == pageNum) { return n; } n = n.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(","); } } StringBuilder reverse = new StringBuilder(); Node n = last; while(n != null){ reverse.append(n.pageNum); n = n.prev; if(n != null){ reverse.append(","); } } System.out.println("buffer: "+ buffer.toString()); System.out.println("reverse: " + reverse.toString()); return buffer.toString(); } }