Skip to content

Commit 99361e2

Browse files
committed
LRU Cache: AC (Implement By Linked List)
1 parent 4c56271 commit 99361e2

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package leetcode.hard.page1;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
public class HardPage1 {
6+
@Test
7+
public void testLRUCache() {
8+
/*LRUCache lruCache = new LRUCache(3);
9+
lruCache.put(1,1);
10+
lruCache.put(2,2);
11+
lruCache.put(3,3);
12+
lruCache.put(4,4);
13+
lruCache.get(4);
14+
lruCache.get(3);
15+
lruCache.get(2);
16+
lruCache.get(1);
17+
lruCache.put(5,5);
18+
lruCache.get(1);
19+
lruCache.get(2);
20+
lruCache.get(3);
21+
lruCache.get(4);
22+
lruCache.get(5);*/
23+
24+
LRUCache lruCache = new LRUCache(2);
25+
lruCache.put(2,1);
26+
lruCache.put(1,1);
27+
lruCache.put(2,3);
28+
lruCache.put(4,1);
29+
lruCache.get(1);
30+
lruCache.get(2);
31+
}
32+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package leetcode.hard.page1;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class LRUCache {
7+
ListNode cacheListHead;
8+
ListNode cacheListTail;
9+
10+
Map<Integer, Integer> cache = new HashMap<>();
11+
int count = 0;
12+
int capacity;
13+
14+
public LRUCache(int capacity) {
15+
this.capacity = capacity;
16+
}
17+
18+
public int get(int key) {
19+
if (count == 0 || !cache.containsKey(key)) return -1;
20+
21+
moveToHead(key);
22+
23+
return cache.get(cacheListHead.val);
24+
}
25+
26+
public void put(int key, int value) {
27+
if (!cache.containsKey(key)) {
28+
if (count < capacity) {
29+
// the max count is equals to capacity
30+
count++;
31+
32+
ListNode node = new ListNode(key);
33+
if (cacheListHead == null) {
34+
cacheListHead = node;
35+
cacheListTail = node;
36+
} else {
37+
node.next = cacheListHead;
38+
cacheListHead = node;
39+
}
40+
} else {
41+
cache.remove(cacheListTail.val);
42+
43+
ListNode newNode = new ListNode(key);
44+
newNode.next = cacheListHead;
45+
cacheListHead = newNode;
46+
47+
ListNode tmpNode = cacheListHead;
48+
while (tmpNode.next != cacheListTail) {
49+
tmpNode = tmpNode.next;
50+
}
51+
52+
tmpNode.next = null;
53+
cacheListTail = tmpNode;
54+
}
55+
} else {
56+
moveToHead(key);
57+
}
58+
cache.put(key, value);
59+
}
60+
61+
private void moveToHead(int key) {
62+
if (cacheListHead.val == key) {
63+
return;
64+
}
65+
66+
ListNode p = cacheListHead;
67+
ListNode q = p.next;
68+
while (q.val != key) {
69+
p = q;
70+
q = p.next;
71+
}
72+
73+
// move q to head
74+
p.next = q.next;
75+
q.next = cacheListHead;
76+
cacheListHead = q;
77+
if (p.next == null) cacheListTail = p;
78+
}
79+
80+
public static class ListNode {
81+
public int val;
82+
public ListNode next;
83+
public ListNode(int x) {
84+
val = x;
85+
next = null;
86+
}
87+
}
88+
}

0 commit comments

Comments
 (0)