package com.coding.basic.linklist; /** * 用双向链表实现LRU算法 * @author liuxin * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node(Node prev,Node next,int pageNum) { this.prev=prev; this.next=next; this.pageNum=pageNum; } } private int capacity; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 * * @param key * @return */ public void access(int pageNum) { if(this.first==null){ first=new Node(null,null,pageNum); return ; } else{ if(last==null){ if(!moveToFirst(pageNum)){ Node nf=new Node(null,this.first,pageNum); this.first.prev=nf; this.first=nf; //判断是否为最后一个 Node cur=this.first; int i=1; while(cur!=null){ cur=cur.next; i++; if(i==this.capacity){ this.last=cur; break; } } } } else{ if(!moveToFirst(pageNum)){ Node nf=new Node(null,this.first,pageNum); this.first.prev=nf; this.first=nf; this.last.prev.next=null; this.last=this.last.prev; } } } } public boolean moveToFirst(int pageNum){ Node indexOf=indexOf(pageNum); if(indexOf!=null){ if(indexOf==this.first){ return true; } else if(indexOf==this.last){ this.first.prev=indexOf; this.last=indexOf.prev; this.last.next=null; indexOf.next=this.first; this.first=indexOf; } else{ indexOf.next.prev=indexOf.prev; indexOf.prev.next=indexOf.next; this.first.prev=indexOf; indexOf.prev=null; indexOf.next=this.first; this.first=indexOf; } return true; } return false; } public Node indexOf(int pageNum){ Node cur=this.first; while(cur!=null){ if(cur.pageNum==pageNum){ return cur; } cur=cur.next; } return 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(); } }