常见数据结构设计
一句话描述这题的话,就是一个 “头 + 尾 dummy node 的双向链表” + “HashMap”.
public class LRUCache {
private class Node{
int key;
int value;
Node prev;
Node next;
public Node(int key, int value){
this.key = key;
this.value = value;
}
}
private int capacity;
private HashMap<Integer, Node> map;
// Head : Most recently used
private Node dummyHead;
// Tail : Least recently used
private Node dummyTail;
public LRUCache(int capacity) {
this.capacity = capacity;
this.map = new HashMap<Integer, Node>();
dummyHead = new Node(-1,-1);
dummyTail = new Node(-1,-1);
dummyHead.next = dummyTail;
dummyTail.prev = dummyHead;
}
public int get(int key) {
if(!map.containsKey(key)) return -1;
// Get current node
Node node = map.get(key);
// Disconnect it from the linkedlist
node.prev.next = node.next;
node.next.prev = node.prev;
// Move it to the front
moveToFront(node);
// Return value
return node.value;
}
public void set(int key, int value) {
if(map.containsKey(key)){
// Get current node
Node node = map.get(key);
// Disconnect it from the linkedlist
node.prev.next = node.next;
node.next.prev = node.prev;
// Move it to the front
moveToFront(node);
// set value
node.value = value;
} else {
if(map.size() >= capacity){
// Remove LRU element and its key
removeLRU();
}
// Create new node
Node node = new Node(key, value);
// Save its key in map
map.put(key, node);
// Move it to the front
moveToFront(node);
}
}
private void moveToFront(Node node){
Node oldHead = dummyHead.next;
// Connect node to dummyHead
dummyHead.next = node;
node.prev = dummyHead;
// Connect node to oldHead
node.next = oldHead;
oldHead.prev = node;
}
private void removeLRU(){
Node node = dummyTail.prev;
// Disconnect node from linkedlist
node.prev.next = node.next;
node.next.prev = node.prev;
// Set null of its pointers
node.next = null;
node.prev = null;
// Remove its key from hashmap
map.remove(node.key);
}
}操作特点:
要点:
Last updated