题目:请设计实现一个最近最少使用缓存,要求如下两个操作的时间复杂度都是O(1)。
- get(key):如果缓存中存在键key,则返回它对应的值;否则返回-1.
- put(key,value):如果缓存中之前包含键key,则它的值设为value;否则添加键key及对应的value。在添加一个键时,如果缓存容量已满,则在添加新键之前删除最近最少使用的键(缓存中最长时间没有被使用过的元素)。
Hashmap的get和put方法时间复杂度是O(1),但其不能找出最近最少使用的键。而要想表示一种顺序关系,不难想到可以使用链表,将链尾视为最近最少使用的元素,每次访问一个元素,将该元素移到链头。
而将元素移到链头之前,应先将节点从原来位置删掉,若仅仅知道待删除节点,是不能知道前驱节点的,故单链表的增删操作复杂度为O (n)。所以我们需使用双向链表。
用哈希表的键保存key,哈希表的值保存双向链表的节点。
class LRUCache {
class DLinkedNode {
int key; //初始化key
int value; //初始化value
//初始化双向链表前后联系指针
DLinkedNode prev;
DLinkedNode next;
//初始化双向链表
public DLinkedNode() {
}
public DLinkedNode(int _key, int _value) {
key = _key;