File tree Expand file tree Collapse file tree 1 file changed +80
-0
lines changed Expand file tree Collapse file tree 1 file changed +80
-0
lines changed Original file line number Diff line number Diff line change
1
+ class LinkedNode (
2
+ val key : Int ,
3
+ var value : Int ,
4
+ var prev : LinkedNode ? ,
5
+ var next : LinkedNode ? ,
6
+ )
7
+
8
+ class LRUCache (private val capacity : Int ) {
9
+ private val pointerByKey = hashMapOf<Int , LinkedNode >()
10
+ private var lruKey: LinkedNode ? = null // head
11
+ private var mruKey: LinkedNode ? = null // tail
12
+ private var size = 0
13
+
14
+ fun get (key : Int ): Int {
15
+ val node = pointerByKey[key]
16
+ node ? : return - 1
17
+
18
+ val value = node.value
19
+
20
+ // pointer comparison
21
+ if (node != = mruKey) {
22
+ node.prev?.next = node.next
23
+ node.next?.prev = node.prev
24
+ if (node == = lruKey) {
25
+ lruKey = node.next
26
+ }
27
+
28
+ mruKey!! .next = node
29
+ node.prev = mruKey
30
+ node.next = null
31
+ mruKey = node
32
+ }
33
+
34
+ return value
35
+ }
36
+
37
+ fun put (key : Int , value : Int ) {
38
+ val cached = get(key)
39
+ if (cached != - 1 ) {
40
+ mruKey!! .value = value
41
+ return
42
+ }
43
+
44
+ if (size == capacity) {
45
+ val removed = lruKey!!
46
+ val newLruKey = removed.next
47
+
48
+ pointerByKey.remove(removed.key)
49
+
50
+ removed.next = null
51
+ newLruKey?.prev = null
52
+
53
+ lruKey = newLruKey
54
+ } else {
55
+ ++ size
56
+ }
57
+
58
+ val newNode = LinkedNode (
59
+ key = key,
60
+ value = value,
61
+ prev = mruKey,
62
+ next = null ,
63
+ )
64
+ pointerByKey[key] = newNode
65
+
66
+ if (lruKey == null ) {
67
+ lruKey = newNode
68
+ }
69
+
70
+ mruKey?.next = newNode
71
+ mruKey = newNode
72
+ }
73
+ }
74
+
75
+ /* *
76
+ * Your LRUCache object will be instantiated and called as such:
77
+ * var obj = LRUCache(capacity)
78
+ * var param_1 = obj.get(key)
79
+ * obj.put(key,value)
80
+ */
You can’t perform that action at this time.
0 commit comments