题目描述

题解
双向哈希链表
题目要求查询和添加操作都是O(1)的时间复杂度, 链表进行增删操作能达到O(1), 哈希表的查询操作能达到O(1), 所以将两种数据结构进行结合.

既然是双向链表, 那么需要构造一个节点类Node, 它需要包含key值和value值, 并且还需要有前节点和后节点
哈希表中的key为节点的key, value存储的就是对应的节点Node 了.目的是为了通过key值直接获取该节点, 以此来高效完成频繁的查询操作
get()方法:
- 如果
map中没有该元素, 直接返回-1 - 否则, 从
map中查询到相应的值, 在返回之前还需要将该节点升到双向链表的首位, 这个过程与put()方法逻辑相同, 直接将该键值对调用put方法即可 
put(key, value)方法:
首先根据传入的(key, value)创建一个
Node节点如果
map中包含该key, 那么缓存的大小不变, 将双向链表中的同键节点删除, 然后将新建的节点添加到链表的首位如果不包含该
key- 如果当前缓存大小小于规定的容量, 直接将新建节点添加到链表首位
 - 如果已经达到了规定的容量, 那么将链表的末位节点删除, 然后将新建节点添加到链表首位
 
1  | public class LRUCache {  |