数据结构题,思路简单,主要在编码上容易思路理不清。
import java.util.HashMap;
import java.util.List;
class ListItem {
int key;
int value;
ListItem pre;
ListItem next;
}
class LRUCache {
HashMap<Integer, ListItem> keyToItem = new HashMap<Integer, ListItem>();
ListItem root = new ListItem();
ListItem tail = new ListItem();
int totalItem = 0;
int capacity = 0;
public LRUCache(int capacity) {
this.capacity = capacity;
root.next = tail;
tail.pre = root;
}
public int get(int key) {
if (keyToItem.containsKey(key)) {
moveToHead(keyToItem.get(key));
return (keyToItem.get(key).value);
} else {
return -1;
}
}
public void put(int key, int value) {
if (keyToItem.containsKey(key)) {
keyToItem.get(key).value = value;
moveToHead(keyToItem.get(key));
} else {
totalItem++;
if (totalItem > capacity) {
removeTail();
totalItem--;
}
addToHeadAndDict(key, value);
}
}
private void moveToHead(ListItem itemToMove) {
itemToMove.pre.next = itemToMove.next;
itemToMove.next.pre = itemToMove.pre;
root.next.pre = itemToMove;
itemToMove.next = root.next;
itemToMove.pre = root;
root.next = itemToMove;
}
private void addToHeadAndDict(int key, int value) {
ListItem newItem = new ListItem();
newItem.key = key;
newItem.value = value;
root.next.pre = newItem;
newItem.next = root.next;
newItem.pre = root;
root.next = newItem;
keyToItem.put(key, newItem);
}
private void removeTail() {
ListItem tailItem = tail.pre;
tail.pre = tailItem.pre;
tailItem.pre.next = tail;
keyToItem.remove(tailItem.key);
}
}
/**
* 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);
*/