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