package com.github.ipk2015.coding2017.basic.linkedlist; /** * 用双向链表实现LRU算法 * @author liuxin * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node() { } } private int capacity; private int size=0; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 * * @param key * @return */ public void access(int pageNum) { if(this.capacity<=1){ throw new RuntimeException("MeaningLess"); } int pos=searchPageNum(pageNum); if(pos==-1){ addFirst(pageNum); return; } if(pos==0){ return; } Node tempNode=first; for(int i=0;i<pos;i++){ tempNode=tempNode.next; } tempNode.prev.next=tempNode.next; if(null!=tempNode.next){ tempNode.next.prev=tempNode.prev; }else{ last=tempNode.prev; } tempNode.prev=null; tempNode.next=first; first=tempNode; } private int searchPageNum(int num){ int pos=-1; boolean flag=false; Node tempNode=first; while(null!=tempNode){ pos++; if(tempNode.pageNum==num){ flag=true; break; } tempNode=tempNode.next; } return flag?pos:-1; } private void addFirst(int num){ Node addNode=new Node(); addNode.pageNum=num; addNode.next=first; if(size<capacity){ if(null!=first){ first.prev=addNode; }else{ last=addNode; } first=addNode; size++; return; } first.prev=addNode; first=addNode; Node tempNode=last; last=last.prev; last.next=null; tempNode.prev=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(","); } } return buffer.toString(); } }