这题不难,就是要理解清楚,然后注意一下各种细节就好。
class LRUCache {
class Node{
int key;
int val;
Node next;
Node prev;
public Node(int key, int val){
this.key = key;
this.val = val;
}
}
int capacity;
Node head;
Node tail;
Map<Integer, Node> map;
public LRUCache(int capacity) {
this.capacity = capacity;
this.head = null;
this.tail = null;
this.map = new HashMap<>(capacity);
}
public int get(int key) {
Node node = map.get(key);
if (node == null){
return -1;
}
if (node != tail){
if (node == head){
head = head.next;
} else {
node.prev.next = node.next;
node.next.prev = node.prev;
}
tail.next = node;
node.prev = tail;
node.next = null;
tail = node;
}
return node.val;
}
public void put(int key, int value) {
Node node = map.get(key);
if (node != null){
node.val = value;
if (node != tail){
if (node == head){
head = head.next;
} else {
node.prev.next = node.next;
node.next.prev = node.prev;
}
tail.next = node;
node.prev = tail;
node.next = null;
tail = node;
}
} else {
Node newNode = new Node(key, value);
if (capacity == 0){
int temp = head.key;
head = head.next;
map.remove(temp);
capacity++;
}
if (head == null){
head = newNode;
tail = newNode;
} else {
tail.next = newNode;
newNode.prev = tail;
newNode.next = null;
}
tail = newNode;
map.put(key, newNode);
capacity--;
}
}
}
/**
* 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);
*/