题目描述
题解
双向哈希链表
题目要求查询和添加操作都是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 { |