hashmap key: key, val: node node : key, value, prev, next;
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 class LRUCache { class Node { Node prev; Node next; int v; int k; Node(int k, int v) { this .k = k; this .v= v; } } Map<Integer, Node> map; Node dummy = new Node (-1 , -1 ); final int capacity; public LRUCache (int capacity) { map = new HashMap <>(capacity); this .capacity = capacity; dummy.prev = dummy; dummy.next = dummy; } public int get (int key) { if (map.containsKey(key)) { moveFront(map.get(key)); return map.get(key).v; } return -1 ; } public void put (int key, int value) { var node = map.get(key); if (node != null ) { moveFront(map.get(key)); node.v = value; } else { Node newNode = new Node (key, value); if (map.size() >= capacity) { var last = dummy.prev; remove(last); map.remove(last.k); } map.put(key, newNode); addFirst(newNode); } } private void moveFront (Node node) { remove(node); addFirst(node); } private void addFirst (Node node) { node.prev = dummy; node.next = dummy.next; dummy.next.prev = node; dummy.next = node; } private void remove (Node node) { node.prev.next = node.next; node.next.prev = node.prev; } }