1. class Node {
    2. public int key, val;
    3. public Node next, prev;
    4. public Node(int k, int v) {
    5. this.key = k;
    6. this.val = v;
    7. }
    8. }
    9. class DoubleList {
    10. private Node head, tail;
    11. private int size;
    12. public void addFirst(Node node) {
    13. if (head == null) {
    14. head = tail = node;
    15. } else {
    16. Node h = head;
    17. h.prev = node;
    18. node.next = h;
    19. head = node;
    20. }
    21. size++;
    22. }
    23. public void remove(Node node) {
    24. if (head == node && tail == node) {
    25. head = null;
    26. tail = null;
    27. } else if (tail == node) {
    28. node.prev.next = null;
    29. tail = node.prev;
    30. node.prev = null;
    31. } else if (head == node) {
    32. node.next.prev = null;
    33. head = node.next;
    34. node.next = null;
    35. } else {
    36. node.prev.next = node.next;
    37. node.next.prev = node.prev;
    38. node.next = null;
    39. node.prev = null;
    40. }
    41. size--;
    42. }
    43. public Node removeLast() {
    44. Node node = tail;
    45. remove(tail);
    46. return node;
    47. }
    48. public int size() {
    49. return size;
    50. }
    51. }
    52. class LRUCache {
    53. private HashMap<Integer, Node> map;
    54. private DoubleList doubleList;
    55. private int cap;
    56. public LRUCache(int capacity) {
    57. this.cap = capacity;
    58. map = new HashMap<>();
    59. doubleList = new DoubleList();
    60. }
    61. public int get(int key) {
    62. if (!map.containsKey(key))
    63. return -1;
    64. Node node = map.get(key);
    65. int val = node.val;
    66. doubleList.remove(node);
    67. doubleList.addFirst(node);
    68. return val;
    69. }
    70. public void put(int key, int val) {
    71. Node x = new Node(key, val);
    72. if (map.containsKey(key)) {
    73. doubleList.remove(map.get(key));
    74. } else {
    75. if (cap == doubleList.size()) {
    76. Node last = doubleList.removeLast();
    77. map.remove(last.key);
    78. }
    79. }
    80. doubleList.addFirst(x);
    81. map.put(key, x);
    82. }
    83. }