Skip to content

Commit 6293262

Browse files
author
Partho Biswas
committed
no message
1 parent e31abeb commit 6293262

File tree

1 file changed

+135
-0
lines changed

1 file changed

+135
-0
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import Foundation
2+
3+
4+
class DoublyLinkedListNode: Equatable {
5+
var key: Int, value: Int
6+
var next: DoublyLinkedListNode?, prev: DoublyLinkedListNode?
7+
8+
init(_ key: Int, _ value: Int) {
9+
self.key = key
10+
self.value = value
11+
}
12+
13+
func removeBindings() {
14+
if self.prev != nil {
15+
self.prev?.next = self.next
16+
}
17+
if self.next != nil {
18+
self.next?.prev = self.prev
19+
}
20+
21+
self.prev = nil
22+
self.next = nil
23+
}
24+
25+
static func == (lhs: DoublyLinkedListNode, rhs: DoublyLinkedListNode) -> Bool {
26+
return lhs.key == rhs.key && lhs.value == rhs.key && lhs.next == rhs.next && lhs.prev == rhs.prev
27+
}
28+
}
29+
30+
class DoublyLinkedList {
31+
var head: DoublyLinkedListNode?, tail: DoublyLinkedListNode?
32+
33+
init() {
34+
}
35+
36+
func setToHead(_ node: DoublyLinkedListNode) {
37+
guard self.head == node else {
38+
return
39+
}
40+
41+
if self.head == nil {
42+
self.head? = node
43+
self.tail? = node
44+
} else if self.head == self.tail {
45+
self.tail?.prev? = node
46+
self.head? = node
47+
self.head?.next = self.tail
48+
} else {
49+
if self.tail == node {
50+
self.removeTail()
51+
}
52+
53+
node.removeBindings()
54+
self.head?.prev? = node
55+
node.next? = self.head!
56+
self.head? = node
57+
}
58+
}
59+
60+
func removeTail() {
61+
guard (self.tail != nil) else {
62+
return
63+
}
64+
65+
if self.tail == self.head {
66+
self.head = nil
67+
self.tail = nil
68+
return
69+
}
70+
71+
self.tail = self.tail?.prev
72+
self.tail?.next = nil
73+
}
74+
}
75+
76+
class LRUCache {
77+
var cache = [Int: DoublyLinkedListNode]()
78+
var capacity: Int
79+
var currentCapacity: Int = 0
80+
var linkedListOfMostRecent = DoublyLinkedList()
81+
82+
init(_ capacity: Int) {
83+
self.capacity = capacity
84+
}
85+
86+
func get(_ key: Int) -> Int {
87+
guard let node = self.cache[key] else {
88+
return -1
89+
}
90+
self.updateMostRecent(self.cache[key]!)
91+
return node.value
92+
}
93+
94+
func put(_ key: Int, _ value: Int) {
95+
if self.cache[key] == nil {
96+
if self.currentCapacity == self.capacity {
97+
self.evictLeastRecent()
98+
} else {
99+
self.currentCapacity += 1
100+
}
101+
self.cache[key] = DoublyLinkedListNode(key, value)
102+
} else {
103+
self.replaceKey(key, value)
104+
}
105+
self.updateMostRecent(self.cache[key]!)
106+
}
107+
108+
func getMostRecentKey() -> Int {
109+
return self.linkedListOfMostRecent.head!.key
110+
}
111+
112+
func evictLeastRecent() {
113+
var keyToRemove = self.linkedListOfMostRecent.tail!.key
114+
self.linkedListOfMostRecent.removeTail()
115+
self.cache[keyToRemove] = nil
116+
}
117+
118+
func updateMostRecent(_ node: DoublyLinkedListNode) {
119+
self.linkedListOfMostRecent.setToHead(node)
120+
}
121+
122+
func replaceKey(_ key: Int, _ value: Int) {
123+
guard self.cache[key] != nil else {
124+
return
125+
}
126+
self.cache[key].value = value
127+
}
128+
}
129+
130+
/**
131+
* Your LRUCache object will be instantiated and called as such:
132+
* let obj = LRUCache(capacity)
133+
* let ret_1: Int = obj.get(key)
134+
* obj.put(key, value)
135+
*/

0 commit comments

Comments
 (0)