

java
class LRUCache {
//定义双向链表的节点结构
class Node{
int key;
int value;
Node prev;
Node next;
public Node(){};
public Node(int key, int value){
this.key = key;
this.value = value;
}
}
private Map<Integer,Node> cache = new HashMap<>();
private int capacity;
private int size;
//头尾节点
private Node head,tail;
public LRUCache(int capacity) {
this.capacity = capacity;
this.size = 0;
//初始化头尾
head = new Node();
tail = new Node();
head.next = tail;
tail.prev = head;
}
//获取
public int get(int key){
Node node = cache.get(key);
if(node == null){
return -1;
}
moveToHead(node);
return node.value;
}
//放入/更新
public void put(int key, int value){
Node node = cache.get(key);
if(node == null){
//全新的数据
Node newNode = new Node(key,value);
cache.put(key,newNode);
addToHead(newNode);
size++;
//判断是否已满
if(size > capacity){
Node tailNode = removeTail();
cache.remove(tailNode.key);
size--;
}
}else{
//更新数据
node.value = value;
moveToHead(node);
}
}
//将一个节点抽出来,插到最前面(现有节点)
private void moveToHead(Node node){
removeNode(node);
addToHead(node);
}
//将一个节点从现有位置取出来
private void removeNode(Node node){
node.prev.next = node.next;
node.next.prev = node.prev;
}
//放到最前面
private void addToHead(Node node){
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
//逐出最久未使用的关键字
private Node removeTail(){
Node res = tail.prev;
removeNode(res);
return res;
}
}
/**
* 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);
*/
哈希表+双向链表的组合结构
写几个方法方便直接调用:
将一个节点直接插入到最前面的方法
将一个节点从当前位置取出来的方法
接节点抽出来放到最前面的方法
丢掉最久未使用的关键字的方法