package com.coding.basic.linkedList; /** * 用双向链表实现LRU算法 * @author liuxin * */ public class LRUPageFrame { private static int stateAtHead = 0; private static int stateAtLast = 1; private static int stateAtMid = 2; private static class Node { Node prev; Node next; int pageNum; Node(){ } } private int capacity; private int size; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 * * @param key * @return */ public void access(int pageNum) { /** * 空链表 */ size ++; Node newNode = new Node(); newNode.pageNum = pageNum; if(size <= capacity){ if(last == null){ last= newNode; first = newNode; }else{ Node preHead = first;//记录原来的头节点 first = newNode; first.next = preHead; preHead.prev = first; } }else{ Node currentNode = first; int judgeNum = currentNode.pageNum; Node preHead = first;//记录原来的头节点 Node preLast = last;//记录原来的尾节点 int state = -1;//记录当前状态 /** * 当前插入的值为等于链表头的位置 */ int k = 0; if(judgeNum == pageNum){ state = stateAtHead; }else if(preLast.pageNum == pageNum){ state = stateAtLast; } while(currentNode != null && k < capacity - 1){ k++; currentNode = currentNode.next; judgeNum = currentNode.pageNum; if(judgeNum == pageNum && judgeNum != preLast.pageNum){ state = stateAtMid; break; } } switch (state) { case -1: first = newNode; last = preLast.prev; first.next = preHead; first.prev = null; preHead.next = last; preHead.prev = first; last.next = null; break; case 0: break; case 1: last = preLast.prev; last.next = null;//原来尾节点的上一个节点变成了尾节点 first = newNode; first.prev = null; first.next = preHead; break; case 2: first = newNode; first.next = preHead; first.prev = null; preHead.next = last; preHead.prev = first; last.prev = preHead; break; } } } 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(); } }