package com.coding.basic.linklist; /** * 用双向链表实现LRU算法 * @author liuxin * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node() { } public Node(int pageNum) { this.pageNum = pageNum; } } private int capacity; private int curSize = 0; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 * * @param pageNum * @return */ public void access(int pageNum) { if (first == null){ first = new Node(pageNum); if (last == null){ last =first; } curSize++; return; } if (curSize < capacity){ Node node = new Node(pageNum); node.next=first; first.prev=node; first=node; curSize++; return; } Node node = first; // 是否已存在 while (node.next!=null){ if (node.pageNum == pageNum){ // 存在即交换 if (first.pageNum == pageNum){ return; } if (node.prev!=null){ node.prev.next=node.next; } if (node.next!=null){ node.next.prev=node.prev; } node.prev=null; node.next=first; first.prev=node; first=node; return; } node=node.next; } // 把最后一个节节点移到开头 node = last; last=last.prev; last.next=null; node.next=first; first.prev=node; first=node; node.pageNum=pageNum; } 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(); } public static void main(String[] args) { LRUPageFrame frame = new LRUPageFrame(3); frame.access(7); frame.access(0); frame.access(1); System.out.println(frame); frame.access(2); System.out.println(frame); } }