package linklist; /** * 用双向链表实现LRU算法 * * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node(int pageNum) { this.pageNum = pageNum; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + pageNum; return result; } @Override public String toString() { return "Node [pageNum=" + pageNum + "]"; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Node other = (Node) obj; if (pageNum != other.pageNum) return false; return true; } } private int capacity; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; } private int size; /** * 获取缓存中对象 * * @param key * @return */ public void access(int pageNum) { if (size < this.capacity) { addNode(pageNum); return; } Node p = findNode(pageNum); if (null == p) { p = new Node(pageNum); p.next = first; first.prev = p; first = p; moveLastPoint(); return; } if (p == first) { return; } if (p == last) { p.next = first; first.prev = p; first = p; moveLastPoint(); return; } movePtoFirst(p); } private void moveLastPoint() { last = last.prev; last.next = null; } private void movePtoFirst(Node p) { p.prev.next = p.next; p.next.prev = p.prev; first.prev = p; p.next = first; first = p; } private void addNode(int pageNum) { Node node = new Node(pageNum); if (null == first) { first = node; size++; return; } node.next = first; first.prev = node; first = node; size++; if (null == last) { last = node.next; return; } } private Node findNode(int pageNum) { Node node = first; while (null != node) { if (node.pageNum != pageNum) { node = node.next; } else { return node; } } return null; } public static void main(String[] args) { } 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(); } }