5
5
/**
6
6
* Implementation of Least Recently Used (LRU) Cache
7
7
*
8
+ * @param <K> generic type of key to be stored
9
+ * @param <V> generic type of associated value corresponding to a given key
8
10
* Constructor:
9
11
* LRU(int capacity)
10
12
* Client methods:
11
13
* get(K key)
12
14
* put(K key, V value)
13
- * Both methods above run in O(1) average time complexity
15
+ * Both methods above run in expected O(1) time complexity
14
16
*/
15
- class LRU {
17
+ class LRU < K , V > {
16
18
/**
17
19
* Helper node class that implements doubly linked list
18
20
*/
19
- private class doublyLinkedList {
20
- private int key ;
21
- private int val ;
22
- private doublyLinkedList next ;
23
- private doublyLinkedList prev ;
21
+ private class doublyLinkedListNode < K , V > {
22
+ private K key ;
23
+ private V val ;
24
+ private doublyLinkedListNode < K , V > next ;
25
+ private doublyLinkedListNode < K , V > prev ;
24
26
}
25
27
26
- private doublyLinkedList dllHead ;
27
- private doublyLinkedList dllTail ;
28
- private HashMap <Integer , doublyLinkedList > keyToNode = new HashMap ();
28
+ private doublyLinkedListNode < K , V > dllHead ;
29
+ private doublyLinkedListNode < K , V > dllTail ;
30
+ private HashMap <K , doublyLinkedListNode < K , V >> keyToNode = new HashMap <> ();
29
31
private int capacity ;
30
32
private int lengthOfList = 0 ;
31
33
@@ -37,31 +39,23 @@ private class doublyLinkedList {
37
39
public LRU (int capacity ) {
38
40
this .capacity = capacity ;
39
41
40
- dllHead = new doublyLinkedList ();
41
- dllHead .key = -1 ;
42
- dllHead .val = -1 ;
43
-
44
- dllTail = new doublyLinkedList ();
45
- dllTail .key = -1 ;
46
- dllTail .val = -1 ;
47
-
48
- dllHead .prev = null ;
42
+ dllHead = new doublyLinkedListNode <>();
43
+ dllTail = new doublyLinkedListNode <>();
49
44
dllHead .next = dllTail ;
50
45
dllTail .prev = dllHead ;
51
- dllTail .next = null ;
52
46
}
53
47
54
48
/**
55
49
* Return the value of the key if it exists or return null
56
50
*
57
51
* @param key key of the value to be obtained from LRU cache
58
52
*/
59
- public int get (int key ) {
53
+ public V get (K key ) {
60
54
if (!keyToNode .containsKey (key )) {
61
- return - 1 ;
55
+ return null ;
62
56
}
63
57
64
- doublyLinkedList temp = keyToNode .get (key );
58
+ doublyLinkedListNode < K , V > temp = keyToNode .get (key );
65
59
temp .prev .next = temp .next ;
66
60
temp .next .prev = temp .prev ;
67
61
@@ -79,13 +73,13 @@ public int get(int key) {
79
73
* @param key key of the value to be inserted to LRU cache
80
74
* @param value value to be inserted to LRU cache
81
75
*/
82
- public void put (int key , int value ) {
76
+ public void put (K key , V value ) {
83
77
boolean addingNewNode = true ;
84
78
85
- doublyLinkedList newlyCached ;
79
+ doublyLinkedListNode < K , V > newlyCached ;
86
80
87
81
if (!keyToNode .containsKey (key )) {
88
- newlyCached = new doublyLinkedList ();
82
+ newlyCached = new doublyLinkedListNode <> ();
89
83
newlyCached .key = key ;
90
84
newlyCached .val = value ;
91
85
keyToNode .put (key , newlyCached );
0 commit comments