package com.coding.basic.linklist; /** * 用双向链表实现LRU算法 * @author 996108220 * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node() { } public Node(int pageNum2) { this.pageNum=pageNum2; this.next=null; this.prev=null; } } private int capacity; private int size; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; this.size=0; } /** * 获取缓存中对象 * * @param key * @return */ public void access(int pageNum) { Node node=remove(pageNum); if (node==null) { node=new Node(pageNum); push(node); } else { addTail(node); } } private void push(Node node) { if (this.size()==capacity) { removeFirst(); } addTail(node); } private void addTail(Node node) { if (size==0) { first=node; last=node; } else { node.prev=last; last.next=node; last=node; } size++; } private void removeFirst() { Node node=this.first; first=first.next; node.next=null; first.prev=null; size--; } private int size() { return size; } private Node remove(int pageNum) { Node node=first; while(node!=null){ if (node.pageNum==pageNum) { if (node==first) { first=node.next; node.next=null; first.prev=null; } else if (node==last) { last=node.prev; last.next=null; node.prev=null; } else { node.prev.next=node.next; node.next.prev=node.prev; node.next=null; node.prev=null; } size--; break; } node=node.next; } return node; } public String toString(){ StringBuilder buffer = new StringBuilder(); Node node = last; while(node != null){ buffer.append(node.pageNum); node = node.prev; if(node != null){ buffer.append(","); } } return buffer.toString(); } }