Skip to content

Commit 4c19e5f

Browse files
committed
Clean up
1 parent 5891a6b commit 4c19e5f

File tree

1 file changed

+38
-40
lines changed

1 file changed

+38
-40
lines changed

Skip-List/SkipList.swift

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import Foundation
2626

2727
// Stack from : https://github.com/raywenderlich/swift-algorithm-club/tree/master/Stack
2828
public struct Stack<T> {
29-
fileprivate var array = [T]()
29+
fileprivate var array: [T] = []
3030

3131
public var isEmpty: Bool {
3232
return array.isEmpty
@@ -62,53 +62,48 @@ extension Stack: Sequence {
6262

6363
private func coinFlip() -> Bool {
6464
#if os(Linux)
65-
return random() % 2 == 0
65+
return random() % 2 == 0
6666
#elseif os(OSX)
67-
return arc4random_uniform(2) == 1
67+
return arc4random_uniform(2) == 1
6868
#endif
6969
}
7070

7171

72-
// MARK: - Node
73-
7472
public class DataNode<Key: Comparable, Payload> {
7573
public typealias Node = DataNode<Key, Payload>
7674

7775
var data : Payload?
7876
fileprivate var key : Key?
79-
internal var next : Node?
80-
internal var down : Node?
77+
var next : Node?
78+
var down : Node?
8179

8280
public init(key: Key, data: Payload) {
8381
self.key = key
8482
self.data = data
8583
}
8684

87-
public init(asHead head: Bool){
88-
}
85+
public init(asHead head: Bool){}
8986

9087
}
9188

9289

93-
// MARK: - Skip List
94-
9590
open class SkipList<Key: Comparable, Payload> {
9691
public typealias Node = DataNode<Key, Payload>
9792

9893
fileprivate(set) var head: Node?
9994

100-
public init() { }
95+
public init() {}
10196

10297
}
10398

10499

105100

106-
// MARK: - Searching
101+
// MARK: - Search lanes for a node with a given key
107102

108103
extension SkipList {
109104

110-
internal func findNode(key: Key) -> Node? {
111-
var currentNode : Node? = self.head
105+
func findNode(key: Key) -> Node? {
106+
var currentNode : Node? = head
112107
var isFound : Bool = false
113108

114109
while !isFound {
@@ -117,7 +112,7 @@ extension SkipList {
117112
switch node.next {
118113
case .none:
119114

120-
currentNode = node.down
115+
currentNode = node.down
121116
case .some(let value) where value.key != nil:
122117

123118
if value.key == key {
@@ -149,26 +144,26 @@ extension SkipList {
149144

150145
}
151146

152-
internal func search(key: Key) -> Payload? {
153-
guard let node = self.findNode(key: key) else {
147+
func search(key: Key) -> Payload? {
148+
guard let node = findNode(key: key) else {
154149
return nil
155150
}
156151

157152
return node.next!.data
158153
}
159-
154+
160155
}
161156

162157

163158

164-
// MARK: - Inserting
159+
// MARK: - Insert a node into lanes depending on skip list status ( bootstrap base-layer if head is empty / start insertion from current head ).
165160

166161
extension SkipList {
167-
private func bootstrapBaseLayer(key: Key, data: Payload) -> Void {
168-
self.head = Node(asHead: true)
169-
var node = Node(key: key, data: data)
162+
private func bootstrapBaseLayer(key: Key, data: Payload) {
163+
head = Node(asHead: true)
164+
var node = Node(key: key, data: data)
170165

171-
self.head!.next = node
166+
head!.next = node
172167

173168
var currentTopNode = node
174169

@@ -177,17 +172,17 @@ extension SkipList {
177172
node = Node(key: key, data: data)
178173
node.down = currentTopNode
179174
newHead.next = node
180-
newHead.down = self.head
181-
self.head = newHead
175+
newHead.down = head
176+
head = newHead
182177
currentTopNode = node
183178
}
184179

185180
}
186181

187182

188-
private func insertItem(key: Key, data: Payload) -> Void {
183+
private func insertItem(key: Key, data: Payload) {
189184
var stack = Stack<Node>()
190-
var currentNode: Node? = self.head
185+
var currentNode: Node? = head
191186

192187
while currentNode != nil {
193188

@@ -219,8 +214,8 @@ extension SkipList {
219214
node = Node(key: key, data: data)
220215
node.down = currentTopNode
221216
newHead.next = node
222-
newHead.down = self.head
223-
self.head = newHead
217+
newHead.down = head
218+
head = newHead
224219
currentTopNode = node
225220

226221
} else {
@@ -236,32 +231,32 @@ extension SkipList {
236231
}
237232

238233

239-
internal func insert(key: Key, data: Payload) {
240-
if self.head != nil {
241-
if let node = self.findNode(key: key) {
242-
// replace in case key already exists
234+
func insert(key: Key, data: Payload) {
235+
if head != nil {
236+
if let node = findNode(key: key) {
237+
// replace, in case of key already exists.
243238
var currentNode = node.next
244239
while currentNode != nil && currentNode!.key == key {
245240
currentNode!.data = data
246241
currentNode = currentNode!.down
247242
}
248243
} else {
249-
self.insertItem(key: key, data: data)
244+
insertItem(key: key, data: data)
250245
}
251246

252247
} else {
253-
self.bootstrapBaseLayer(key: key, data: data)
248+
bootstrapBaseLayer(key: key, data: data)
254249
}
255250
}
256251

257252
}
258253

259254

260-
// MARK: - Removing
255+
// MARK: - Remove a node with a given key. First, find its position in layers at the top, then remove it from each lane by traversing down to the base layer.
261256

262257
extension SkipList {
263-
public func remove(key: Key) -> Void {
264-
guard let item = self.findNode(key: key) else {
258+
public func remove(key: Key) {
259+
guard let item = findNode(key: key) else {
265260
return
266261
}
267262

@@ -285,9 +280,12 @@ extension SkipList {
285280
}
286281
}
287282

283+
284+
// MARK: - Get associated payload from a node with a given key.
285+
288286
extension SkipList {
289287

290288
public func get(key:Key) -> Payload?{
291-
return self.search(key: key)
289+
return search(key: key)
292290
}
293291
}

0 commit comments

Comments
 (0)