@@ -4,25 +4,27 @@ public class LinkedListNode<T> {
4
4
var value : T
5
5
var next : LinkedListNode ?
6
6
weak var previous : LinkedListNode ?
7
-
7
+
8
8
public init ( value: T ) {
9
9
self . value = value
10
10
}
11
11
}
12
12
13
13
public final class LinkedList < T> {
14
14
public typealias Node = LinkedListNode < T >
15
-
15
+
16
16
fileprivate var head : Node ?
17
-
17
+
18
+ public init ( ) { }
19
+
18
20
public var isEmpty : Bool {
19
21
return head == nil
20
22
}
21
-
23
+
22
24
public var first : Node ? {
23
25
return head
24
26
}
25
-
27
+
26
28
public var last : Node ? {
27
29
if var node = head {
28
30
while case let next? = node. next {
@@ -33,7 +35,7 @@ public final class LinkedList<T> {
33
35
return nil
34
36
}
35
37
}
36
-
38
+
37
39
public var count : Int {
38
40
if var node = head {
39
41
var c = 1
@@ -46,7 +48,7 @@ public final class LinkedList<T> {
46
48
return 0
47
49
}
48
50
}
49
-
51
+
50
52
public func node( atIndex index: Int ) -> Node ? {
51
53
if index >= 0 {
52
54
var node = head
@@ -59,80 +61,88 @@ public final class LinkedList<T> {
59
61
}
60
62
return nil
61
63
}
62
-
64
+
63
65
public subscript( index: Int ) -> T {
64
66
let node = self . node ( atIndex: index)
65
67
assert ( node != nil )
66
68
return node!. value
67
69
}
68
-
70
+
69
71
public func append( _ value: T ) {
70
72
let newNode = Node ( value: value)
73
+ self . append ( newNode)
74
+ }
75
+
76
+ public func append( _ newNode: Node ) {
71
77
if let lastNode = last {
72
78
newNode. previous = lastNode
73
79
lastNode. next = newNode
74
80
} else {
75
81
head = newNode
76
82
}
77
83
}
78
-
84
+
79
85
private func nodesBeforeAndAfter( index: Int ) -> ( Node ? , Node ? ) {
80
86
assert ( index >= 0 )
81
-
87
+
82
88
var i = index
83
89
var next = head
84
90
var prev : Node ?
85
-
91
+
86
92
while next != nil && i > 0 {
87
93
i -= 1
88
94
prev = next
89
95
next = next!. next
90
96
}
91
97
assert ( i == 0 ) // if > 0, then specified index was too large
92
-
98
+
93
99
return ( prev, next)
94
100
}
95
-
101
+
96
102
public func insert( _ value: T , atIndex index: Int ) {
97
- let ( prev, next) = nodesBeforeAndAfter ( index: index)
98
-
99
103
let newNode = Node ( value: value)
104
+ self . insert ( newNode, atIndex: index)
105
+ }
106
+
107
+ public func insert( _ newNode: Node , atIndex index: Int ) {
108
+ let ( prev, next) = nodesBeforeAndAfter ( index: index)
109
+
100
110
newNode. previous = prev
101
111
newNode. next = next
102
112
prev? . next = newNode
103
113
next? . previous = newNode
104
-
114
+
105
115
if prev == nil {
106
116
head = newNode
107
117
}
108
118
}
109
-
119
+
110
120
public func removeAll( ) {
111
121
head = nil
112
122
}
113
-
114
- public func remove( node: Node ) -> T {
123
+
124
+ @ discardableResult public func remove( node: Node ) -> T {
115
125
let prev = node. previous
116
126
let next = node. next
117
-
127
+
118
128
if let prev = prev {
119
129
prev. next = next
120
130
} else {
121
131
head = next
122
132
}
123
133
next? . previous = prev
124
-
134
+
125
135
node. previous = nil
126
136
node. next = nil
127
137
return node. value
128
138
}
129
-
130
- public func removeLast( ) -> T {
139
+
140
+ @ discardableResult public func removeLast( ) -> T {
131
141
assert ( !isEmpty)
132
142
return remove ( node: last!)
133
143
}
134
-
135
- public func remove( atIndex index: Int ) -> T {
144
+
145
+ @ discardableResult public func remove( atIndex index: Int ) -> T {
136
146
let node = self . node ( atIndex: index)
137
147
assert ( node != nil )
138
148
return remove ( node: node!)
@@ -173,7 +183,7 @@ extension LinkedList {
173
183
}
174
184
return result
175
185
}
176
-
186
+
177
187
public func filter( predicate: ( T ) -> Bool ) -> LinkedList < T > {
178
188
let result = LinkedList < T > ( )
179
189
var node = head
@@ -187,21 +197,23 @@ extension LinkedList {
187
197
}
188
198
}
189
199
190
- extension LinkedList : ExpressibleByArrayLiteral {
200
+ extension LinkedList {
191
201
convenience init ( array: Array < T > ) {
192
202
self . init ( )
193
-
203
+
194
204
for element in array {
195
205
self . append ( element)
196
206
}
197
207
}
198
-
208
+ }
209
+
210
+ extension LinkedList : ExpressibleByArrayLiteral {
199
211
public convenience init ( arrayLiteral elements: T ... ) {
200
- self . init ( )
212
+ self . init ( )
201
213
202
- for element in elements {
203
- self . append ( element)
204
- }
214
+ for element in elements {
215
+ self . append ( element)
216
+ }
205
217
}
206
218
}
207
219
0 commit comments