基于链表和Map实现时间复杂度位O(1)的LRU:
- 用双向链表存储数据,为的是实现LRU,双向链表头部放的是热点数据,尾部是冷数据
- 用Map为的是快速查找,不用在链表上遍历查找
- 不用双向链表行不行?不行,Map不能实现LRU
- 用单链表行不行?行,因为根本不在链表上查询,只是插入、移除
package leetcode2;
import java.util.HashMap;
import java.util.Map;
public class LRU {
static class Node {
int value;
String key;
Node next;
Node pre;
Node(String k, int v) {
key = k;
value = v;
}
}
private int len = 0;
private Node head = new Node("-1",-1);
private Node tail = new Node("-1",-1);
private Map<String,Node> map = new HashMap<>();
private void set(String k, int value) {
if (map.get(k) != null) {
map.get(k).value = value;
} else {
if (map.size() == len) {
tail.pre = tail.pre.pre;
tail.pre.next = tail;
}
Node node = new Node(k,value);
node.next = head.next;
node.next.pre = node;
head.next = node;
node.pre = head;
len++;
}
}
private Node get(String key) {
Node node = map.get(key);
if (node != null) {
Node pre = node.pre;
Node next = node.next;
pre.next = next;
next.pre = pre;
// 插入头部
node.next = head.next;
node.next.pre = node;
head.next = node;
node.pre = head;
}
return node;
}
}