forked from seanprashad/leetcode-patterns
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path146_LRU_Cache.java
92 lines (72 loc) · 1.82 KB
/
146_LRU_Cache.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
classLRUCache {
privateclassDLLNode {
privateintkey, value;
privateDLLNodenext, prev;
publicDLLNode() {
key = -1;
value = -1;
next = null;
prev = null;
}
publicDLLNode(intk, intv) {
key = k;
value = v;
next = null;
prev = null;
}
}
privateDLLNodehead, tail;
privateMap<Integer, DLLNode> hm;
privateintcap, size;
publicLRUCache(intcapacity) {
cap = capacity;
size = 0;
hm = newHashMap<>();
head = newDLLNode();
tail = newDLLNode();
head.next = tail;
tail.prev = head;
}
publicintget(intkey) {
if (!hm.containsKey(key)) {
return -1;
}
DLLNodenode = hm.get(key);
moveToHead(node);
returnnode.value;
}
publicvoidput(intkey, intvalue) {
if (hm.containsKey(key)) {
DLLNodenode = hm.get(key);
node.value = value;
hm.put(key, node);
moveToHead(node);
return;
}
DLLNodenode = newDLLNode(key, value);
hm.put(key, node);
moveToHead(node);
++size;
if (size > cap) {
remove(tail.prev);
--size;
}
}
privatevoidremove(DLLNodenode) {
node.prev.next = node.next;
node.next.prev = node.prev;
hm.remove(node.key);
}
privatevoidmoveToHead(DLLNodenode) {
if (node.prev != null) {
node.prev.next = node.next;
}
if (node.next != null) {
node.next.prev = node.prev;
}
node.next = head.next;
node.prev = head;
head.next.prev = node;
head.next = node;
}
}