@@ -9,17 +9,32 @@ class LinkedList<T> {
9
9
}
10
10
11
11
init ? ( array: [ T ] ) {
12
+ let reversed = array. reversed ( )
12
13
guard let first = array. first else {
13
14
return nil
14
15
}
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
16
24
self . value = first
17
25
}
26
+
27
+ func array( ) -> Array < T > {
28
+ if let next = next {
29
+ return [ value] + next. array ( )
30
+ }
31
+ return [ value]
32
+ }
18
33
}
19
34
20
35
class DoublyLinkedList < T> {
21
36
let next : DoublyLinkedList ?
22
- private( set) var previous : DoublyLinkedList ? = nil
37
+ private( set) var previous : DoublyLinkedList ?
23
38
var head : DoublyLinkedList {
24
39
guard let previous = previous else {
25
40
return self
@@ -29,16 +44,38 @@ class DoublyLinkedList<T> {
29
44
30
45
var value : T
31
46
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 {
34
56
return nil
35
57
}
36
58
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
39
69
self . next? . previous = self
40
70
}
41
71
72
+ convenience init ? ( linkedList: LinkedList < T > ? ) {
73
+ guard let linkedList = linkedList else {
74
+ return nil
75
+ }
76
+ self . init ( array: linkedList. array ( ) )
77
+ }
78
+
42
79
func array( ) -> Array < T > {
43
80
if let next = next {
44
81
return [ value] + next. array ( )
0 commit comments