package com.coding.basic.datastructure.linklist; /** * 用双向链表实现LRU算法 * * @author zt */ public class LRUPageFrame { private int capacity; private Node first; private Node last; private int size = 0; public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 */ public void access(int pageNum) { if (first == null) { first = new Node(); first.pageNum = pageNum; last = first; size++; } else { if (size < capacity) { linkFirst(pageNum); size++; } else { Node p = first; int count = 0; while (p != null) { if (p.pageNum == pageNum) { if (p == first) { break; } else if (p == last) { last = p.prev; p.prev.next = null; linkNodeToFirst(p); } else { p.next.prev = p.prev; p.prev.next = p.next; linkNodeToFirst(p); } break; } p = p.next; count++; } // if doesn't contains the same value if (count >= size) { linkFirst(pageNum); removeLast(); } } } } private void linkNodeToFirst(Node p) { first.prev = p; p.next = first; p.prev = null; first = p; } private void linkFirst(int pageNum) { Node node = new Node(); node.pageNum = pageNum; first.prev = node; node.next = first; first = node; } private void removeLast() { last = last.prev; last.next = null; } @Override 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(); } private static class Node { Node prev; Node next; int pageNum; Node() { } } }