package cn.xl.basic.linklist; /** * 用双向链表实现LRU(Least Recently Used 近期最少使用算法) * @author CoderXLoong * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node(Node _prev,int _pageNum,Node _next) { this.prev = _prev; this.pageNum = _pageNum; this.next = _next; } } private int capacity; private int size; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 * * @param key * @return */ public void access(int pageNum) { if(first != null && first.pageNum == pageNum){ return; } removeNode(pageNum); if(size()+1 > capacity){ removeLast(); } addFirst(pageNum); } private int size(){ return size; } private void addFirst(int pageNum){ final Node f = first; final Node newNode = new Node(null,pageNum,f); if(f == null){ last = newNode; }else{ f.prev = newNode; } first = newNode; size++; } private void removeLast(){ final Node l = last; final Node prev = l.prev; prev.next = null; l.prev = null; last = prev; size --; } private void removeNode(int pageNum){ Node node = first; while(node != null){ if(node.pageNum == pageNum){ if(node == last){ removeLast(); }else{ final Node prev = node.prev; final Node next = node.next; prev.next = next; next.prev = prev; node.prev = null; node.next = null; size--; } break; }else{ node = node.next; } } } 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(); } }