1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| import java.util.HashMap;
public class MyLinkedLRU {
private int maxSize;
private Node head, tail;
private HashMap<Integer, Node> keyNodeMap;
public MyLinkedLRU(int maxSize) { this.maxSize = maxSize; head = new Node(-1, -1); tail = new Node(0, 0); head.next = tail; tail.pre = head; this.keyNodeMap = new HashMap<Integer, Node>(); }
public int get(int key) { Node node = keyNodeMap.get(key); if (node != null) { moveToHead(node); return node.value; } return -1; }
public void set(int key, int value) { Node node = null; if (keyNodeMap.containsKey(key)) { node = keyNodeMap.get(key); node.value = value; } else { node = new Node(key, value); if (keyNodeMap.size() == maxSize) { keyNodeMap.remove(removeTail()); } keyNodeMap.put(key, node); } moveToHead(node); }
private void moveToHead(Node node) { if (node.pre != null || node.next != null) { node.next.pre = node.pre; node.pre.next = node.next; } node.next = head.next; head.next.pre = node; node.pre = head; head.next = node; }
private int removeTail() { int lastKey = -1; if (tail.pre != head) { Node lastNode = tail.pre; lastKey = lastNode.key; lastNode.pre.next = tail; tail.pre = lastNode.pre; lastNode = null; } return lastKey; }
@Override public String toString() { String res = ""; Node item = head; while (item != tail.pre) { res += "[" + item.next.key + ", " + item.next.value + "] "; item = item.next; } return res; }
public static void main(String[] args) { MyLinkedLRU lru = new MyLinkedLRU(5); lru.set(1, 1); lru.set(2, 2); lru.set(3, 3); lru.set(4, 4); lru.set(5, 5); lru.set(6, 6); lru.set(7, 7); lru.set(1, 1); lru.set(2, 2); lru.set(5, 5); lru.set(8, 8); lru.get(5); System.out.println(lru.toString()); } }
class Node { int key; int value; Node pre; Node next;
public Node(int k, int v) { key = k; value = v; } }
|