class LRUCache { private int _capacity; private int _currentSize; private MapnodeMap; private Node head; private Node tail; class Node { public int key; public int value; public Node next; public Node prev; public Node(int k, int v) { key = k; value = v; } } public LRUCache(int capacity) { _capacity = capacity; _currentSize = 0; head = new Node(0, 0); tail = new Node(0, 0); tail.prev = head; head.next = tail; nodeMap = new HashMap<>(); } public int get(int key) { if (!nodeMap.containsKey(key)) { return -1; } moveNode(nodeMap.get(key)); return nodeMap.get(key).value; } public void put(int key, int value) { if (!nodeMap.containsKey(key)) { if (_currentSize == _capacity) { nodeMap.remove(tail.prev.key); tail = tail.prev; tail.next = null; _currentSize--; } Node current = new Node(key, value); current.next = head.next; current.next.prev = current; current.prev = head; head.next = current; nodeMap.put(key, current); _currentSize++; } else { moveNode(nodeMap.get(key)); nodeMap.get(key).value = value; } } private void moveNode(Node current) { current.next.prev = current.prev; current.prev.next= current.next; current.next = head.next; head.next.prev = current; head.next = current; current.prev = head; }}/** * Your LRUCache object will be instantiated and called as such: * LRUCache obj = new LRUCache(capacity); * int param_1 = obj.get(key); * obj.put(key,value); */