Skip to content

Commit f4fdeff

Browse files
committed
Update 146_LRU_Cache.java
1 parent 902ab32 commit f4fdeff

File tree

1 file changed

+49
-40
lines changed

1 file changed

+49
-40
lines changed

Design/146_LRU_Cache.java

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,92 @@
11
class LRUCache {
2-
private static class DLLNode {
2+
private class DLLNode {
3+
private int key, value;
34
private DLLNode next, prev;
4-
private int key;
5-
private int value;
65

7-
public DLLNode(int key, int value) {
8-
this.key = key;
9-
this.value = value;
6+
public DLLNode() {
7+
key = -1;
8+
value = -1;
9+
10+
next = null;
11+
prev = null;
12+
}
13+
14+
public DLLNode(int k, int v) {
15+
key = k;
16+
value = v;
17+
18+
next = null;
19+
prev = null;
1020
}
1121
}
1222

13-
private int capacity;
1423
private DLLNode head, tail;
1524
private Map<Integer, DLLNode> hm;
25+
private int cap, size;
1626

1727
public LRUCache(int capacity) {
18-
this.capacity = capacity;
28+
cap = capacity;
29+
size = 0;
30+
1931
hm = new HashMap<>();
2032

21-
head = tail = new DLLNode(-1, -1);
33+
head = new DLLNode();
34+
tail = new DLLNode();
35+
2236
head.next = tail;
2337
tail.prev = head;
2438
}
2539

2640
public int get(int key) {
27-
DLLNode node = hm.get(key);
28-
if (node == null) {
41+
if (!hm.containsKey(key)) {
2942
return -1;
3043
}
3144

32-
moveNodeToHead(node);
45+
DLLNode node = hm.get(key);
46+
moveToHead(node);
3347
return node.value;
3448
}
3549

3650
public void put(int key, int value) {
37-
DLLNode node = hm.get(key);
38-
39-
if (node != null) {
51+
if (hm.containsKey(key)) {
52+
DLLNode node = hm.get(key);
4053
node.value = value;
41-
moveNodeToHead(node);
54+
hm.put(key, node);
55+
moveToHead(node);
4256
return;
4357
}
4458

45-
node = new DLLNode(key, value);
59+
DLLNode node = new DLLNode(key, value);
4660
hm.put(key, node);
47-
addNode(node);
61+
moveToHead(node);
62+
++size;
4863

49-
if (hm.size() > capacity) {
50-
hm.remove(tail.prev.key);
51-
removeTail(tail.prev);
64+
if (size > cap) {
65+
remove(tail.prev);
66+
--size;
5267
}
5368
}
5469

55-
private void moveNodeToHead(DLLNode node) {
56-
removeNode(node);
57-
addNode(node);
58-
}
70+
private void remove(DLLNode node) {
71+
node.prev.next = node.next;
72+
node.next.prev = node.prev;
5973

60-
private void removeTail(DLLNode node) {
61-
removeNode(node);
74+
hm.remove(node.key);
6275
}
6376

64-
private void addNode(DLLNode node) {
77+
private void moveToHead(DLLNode node) {
78+
if (node.prev != null) {
79+
node.prev.next = node.next;
80+
}
81+
82+
if (node.next != null) {
83+
node.next.prev = node.prev;
84+
}
85+
6586
node.next = head.next;
6687
node.prev = head;
6788

6889
head.next.prev = node;
6990
head.next = node;
7091
}
71-
72-
private void removeNode(DLLNode node) {
73-
if (node == null) {
74-
return;
75-
}
76-
77-
DLLNode prev = node.prev;
78-
DLLNode next = node.next;
79-
80-
prev.next = next;
81-
next.prev = prev;
82-
}
8392
}

0 commit comments

Comments
 (0)