Skip to content

Commit 66bfb18

Browse files
authored
Merge pull request wokalski#48 from farzadshbfn/master
Fixes #46. Stack overflow crash.
2 parents 7c902f8 + f622eff commit 66bfb18

File tree

1 file changed

+43
-6
lines changed

1 file changed

+43
-6
lines changed

Sources/LinkedList.swift

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,32 @@ class LinkedList<T> {
99
}
1010

1111
init?(array: [T]) {
12+
let reversed = array.reversed()
1213
guard let first = array.first else {
1314
return nil
1415
}
15-
self.next = LinkedList(array: Array(array.dropFirst()))
16+
17+
var tailLinkedList: LinkedList?
18+
19+
for i in 0 ..< reversed.count - 1 {
20+
tailLinkedList = LinkedList(next: tailLinkedList, value: reversed.itemOnStartIndex(advancedBy: i))
21+
}
22+
23+
self.next = tailLinkedList
1624
self.value = first
1725
}
26+
27+
func array() -> Array<T> {
28+
if let next = next {
29+
return [value] + next.array()
30+
}
31+
return [value]
32+
}
1833
}
1934

2035
class DoublyLinkedList<T> {
2136
let next: DoublyLinkedList?
22-
private(set) var previous: DoublyLinkedList? = nil
37+
private(set) var previous: DoublyLinkedList?
2338
var head: DoublyLinkedList {
2439
guard let previous = previous else {
2540
return self
@@ -29,16 +44,38 @@ class DoublyLinkedList<T> {
2944

3045
var value: T
3146

32-
init?(linkedList: LinkedList<T>?) {
33-
guard let element = linkedList else {
47+
init(next: DoublyLinkedList?, value: T) {
48+
self.value = value
49+
self.next = next
50+
self.next?.previous = self
51+
}
52+
53+
init?(array: [T]) {
54+
let reversed = array.reversed()
55+
guard let first = array.first else {
3456
return nil
3557
}
3658

37-
self.value = element.value
38-
self.next = DoublyLinkedList(linkedList: element.next)
59+
var tailDoublyLinkedList: DoublyLinkedList?
60+
61+
for i in 0 ..< reversed.count - 1 {
62+
let nextTail = DoublyLinkedList(next: tailDoublyLinkedList, value: reversed.itemOnStartIndex(advancedBy: i))
63+
tailDoublyLinkedList?.previous = nextTail
64+
tailDoublyLinkedList = nextTail
65+
}
66+
67+
self.value = first
68+
self.next = tailDoublyLinkedList
3969
self.next?.previous = self
4070
}
4171

72+
convenience init?(linkedList: LinkedList<T>?) {
73+
guard let linkedList = linkedList else {
74+
return nil
75+
}
76+
self.init(array: linkedList.array())
77+
}
78+
4279
func array() -> Array<T> {
4380
if let next = next {
4481
return [value] + next.array()

0 commit comments

Comments
 (0)