package com.coding.basic.linklist; /** * ��˫������ʵ��LRU�㷨 * * @author liuxin * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node() { } } private int capacity; private Node first;// ����ͷ private Node last;// ����β public LRUPageFrame(int capacity) { this.capacity = capacity; first = null; last = null; } /** * ��ȡ�����ж��� * * @param key * @return */ public void access(int pageNum) { Node node = new Node(); node.prev = null; node.pageNum = pageNum; if (first == null) { node.next = null; first = node; return; } if(judgeEqual(node, pageNum)){ return; } node.next = first; first.prev = node; first = node; if (last == null) { judgeFull(); } else { Node temp = last.prev; last.prev = null; last.next = null; last.pageNum = 0; temp.next = null; last = temp; } } private boolean judgeEqual(Node node, int pageNum) { if (first.pageNum == pageNum) { return true; } Node nd = first; while (nd != null) { if (nd.pageNum == pageNum) { if (nd.next != null) { nd.prev.next = nd.next; nd.next.prev = nd.prev; nd.prev = null; nd.next = first; first = nd; } else { if (last != null) { last = nd.prev; } nd.prev.next = null; nd.prev = null; nd.next = first; first.prev=nd; first = nd; } return true; } nd = nd.next; } return false; } // �ж������Ƿ�������˲�����last private void judgeFull() { int count = 0; Node node = first; while (node != null) { count++; if (count == this.capacity) { last = node; return; } node = node.next; } if (count >= this.capacity) { } } 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(); } }