哈希表 + 双向链表
//定义元素
public class LRUCache {
class DLinkedNode {
int key;
int value;
DLinkedNode prev;
DLinkedNode next;
public DLinkedNode() {}
public DLinkedNode(int _key, int _value) {key = _key; value = _value;}
}
private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
private int size;
private int capacity;
private DLinkedNode head, tail;
public LRUCache(int capacity) {
this.size = 0;
this.capacity = capacity;
// 使用伪头部和伪尾部节点
head = new DLinkedNode();
tail = new DLinkedNode();
head.next = tail;
tail.prev = head;
}
public int get(int key){
DLinkedNode node = cache.get(key);
if(node == null){
return -1;
}
//将该值放到链表的头部
moveToHead(node);
return node.value;
}
public void put(int key, int value){
DLinkedNode node = cache.get(key);
if(node == null){
//创建新节点
DLinkedNode newNode = new DLinkedNode(key,value);
//添加进cache
cache.put(key,newNode);
//添加至双向链表的头部
addToHead(newNode);
++size;
if(size > capacity){
//如果超出容量,删除掉链表的尾部节点
DLinkedNode removeNode = removeTail();
//删除哈希表中对应的项
cache.remove(removeNode.key);
--size;
}
} else{
node.value = value;
moveToHead(node);
}
}
public void addToHead(DLinkedNode node){
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
public void moveToHead(DLinkedNode node){
removeNode(node);
addToHead(node);
}
public void removeNode(DLinkedNode node){
node.prev.next = node.next;
node.next.prev = node.prev;
}
public DLinkedNode removeTail(){
DLinkedNode node = tail.prev;
removeNode(node);
return node;
}
}