需要创建一个map和一个双向链表
map中key为输入的key,value为一个Node结点
java
import java.util.HashMap;
import java.util.Map;
class LRUCache {
/**
* 双向链表节点
*/
class Node {
int key, value;
// 前驱和后继
Node prev, next;
/**
* 全参构造
* @param k
* @param v
*/
public Node(int k, int v) {
key = k;
value = v;
}
/**
* 空参构造
*/
public Node() {
}
}
// 缓存
private Map<Integer, Node> cache = new HashMap<>();
// 当前缓存大小
private int size;
// 总缓存大小
private int capacity;
// 双向链表的头尾哨兵节点,不存储数据
private Node head, tail;
/**
* 初始化双向链表
* @param capacity
*/
public LRUCache(int capacity) {
this.capacity = capacity;
head = new Node();
tail = new Node();
head.next = tail;
tail.prev = head;
}
/**
* 获得key
* @param key
* @return
*/
public int get(int key) {
Node node = cache.get(key);
if (node == null) {
return -1;
}
// 如果key存在,需要移动双向链表
moveToHead(node);
return node.value;
}
/**
* 添加结点
* @param key
* @param 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);
// 当前容量 +1
size++;
// 判断是否超出容量
if (size > capacity) {
// 删除双向链表的尾节点
Node lastNode = removeTail();
// 删除哈希表中的key-value
cache.remove(lastNode.key);
size--;
}
} else {
// 没有超出容量
// 修改value
node.value = value;
// 移动到头结点
moveToHead(node);
}
}
/**
* 移除尾节点
* @return 删除的节点
*/
private Node removeTail() {
Node prev = tail.prev;
moveToList(prev);
return prev;
}
/**
* 移除结点并且添加到头结点
* @param node
*/
private void moveToHead(Node node) {
moveToList(node);
addToHead(node);
}
/**
* 添加到链表头部
* @param node
*/
private void addToHead(Node node) {
node.next = head.next;
node.prev = head;
head.next.prev = node;
head.next = node;
}
/**
* 把当前结点移除链表
* @param node
*/
private void moveToList(Node node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
}