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
| import java.util.HashMap; import java.util.Map;
public class LRUCache { class Node { int key; int val; Node prev; Node next;
public Node(int key, int val) { this.key = key; this.val = val; }
public Node() {
} }
private Node head, tail; private int size; private int capacity; private Map<Integer, Node> cache = new HashMap<>();
public LRUCache(int capacity) { this.capacity = capacity; this.size = 0; head = new Node(); tail = new Node(); head.next = tail; tail.prev = head; }
public int get(int key) { Node node = cache.get(key); if (node == null) { return -1; } moveToHead(node); return node.val; }
public void put(int key, int val) { Node node = cache.get(key); if (node == null) { Node newNode = new Node(key, val); cache.put(key, newNode); addToHead(newNode); size++; if (size > capacity) { Node res = removeTail(); cache.remove(res.key); size--; } } else { node.val = val; moveToHead(node); } }
private void addToHead(Node node) { node.prev = head; node.next = head.next; head.next.prev = node; head.next = node; }
private void removeNode(Node node) { node.prev.next = node.next; node.next.prev = node.prev; }
private void moveToHead(Node node) { removeNode(node); addToHead(node); }
private Node removeTail() { Node tmp = tail.prev; removeNode(tmp); return tmp; } }
|