From 49a4233244201272f52bdf77e65698ae5bdf46c7 Mon Sep 17 00:00:00 2001 From: FarzadShbfn Date: Wed, 8 Mar 2017 16:38:58 +0330 Subject: [PATCH 1/3] Fix for Issue #46 --- Sources/LinkedList.swift | 58 +++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/Sources/LinkedList.swift b/Sources/LinkedList.swift index 62b5963..eacccfa 100644 --- a/Sources/LinkedList.swift +++ b/Sources/LinkedList.swift @@ -9,12 +9,27 @@ class LinkedList { } init?(array: [T]) { + let reversed = Array(array.reversed()) guard let first = array.first else { return nil } - self.next = LinkedList(array: Array(array.dropFirst())) - self.value = first + + var tailLinkedList: LinkedList? = nil + + for i in 0 ..< reversed.count - 1 { + tailLinkedList = LinkedList(next: tailLinkedList, value: reversed[i]) + } + + self.next = tailLinkedList + self.value = first } + + func array() -> Array { + if let next = next { + return [value] + next.array() + } + return [value] + } } class DoublyLinkedList { @@ -28,15 +43,38 @@ class DoublyLinkedList { } var value: T + + init(next: DoublyLinkedList?, value: T) { + self.value = value + self.next = next + self.next?.previous = self + } + + + init?(array: [T]) { + let reversed = Array(array.reversed()) + guard let first = array.first else { + return nil + } + + var tailDoublyLinkedList: DoublyLinkedList? = nil + + for i in 0 ..< reversed.count - 1 { + let nextTail = DoublyLinkedList(next: tailDoublyLinkedList, value: reversed[i]) + tailDoublyLinkedList?.previous = nextTail + tailDoublyLinkedList = nextTail + } + + self.value = first + self.next = tailDoublyLinkedList + self.next?.previous = self + } - init?(linkedList: LinkedList?) { - guard let element = linkedList else { - return nil - } - - self.value = element.value - self.next = DoublyLinkedList(linkedList: element.next) - self.next?.previous = self + convenience init?(linkedList: LinkedList?) { + guard let linkedList = linkedList else { + return nil + } + self.init(array: linkedList.array()) } func array() -> Array { From 34d92fa7cbafc4db2a9ef29f0463a0e35d66058c Mon Sep 17 00:00:00 2001 From: FarzadShbfn Date: Wed, 8 Mar 2017 16:40:21 +0330 Subject: [PATCH 2/3] swiftformat on LinkedList.swift --- Sources/LinkedList.swift | 95 ++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/Sources/LinkedList.swift b/Sources/LinkedList.swift index eacccfa..6c8d06d 100644 --- a/Sources/LinkedList.swift +++ b/Sources/LinkedList.swift @@ -9,32 +9,32 @@ class LinkedList { } init?(array: [T]) { - let reversed = Array(array.reversed()) + let reversed = Array(array.reversed()) guard let first = array.first else { return nil } - - var tailLinkedList: LinkedList? = nil - - for i in 0 ..< reversed.count - 1 { - tailLinkedList = LinkedList(next: tailLinkedList, value: reversed[i]) - } - - self.next = tailLinkedList - self.value = first + + var tailLinkedList: LinkedList? + + for i in 0 ..< reversed.count - 1 { + tailLinkedList = LinkedList(next: tailLinkedList, value: reversed[i]) + } + + self.next = tailLinkedList + self.value = first + } + + func array() -> Array { + if let next = next { + return [value] + next.array() + } + return [value] } - - func array() -> Array { - if let next = next { - return [value] + next.array() - } - return [value] - } } class DoublyLinkedList { let next: DoublyLinkedList? - private(set) var previous: DoublyLinkedList? = nil + private(set) var previous: DoublyLinkedList? var head: DoublyLinkedList { guard let previous = previous else { return self @@ -43,38 +43,37 @@ class DoublyLinkedList { } var value: T - - init(next: DoublyLinkedList?, value: T) { - self.value = value - self.next = next - self.next?.previous = self - } - - - init?(array: [T]) { - let reversed = Array(array.reversed()) - guard let first = array.first else { - return nil - } - - var tailDoublyLinkedList: DoublyLinkedList? = nil - - for i in 0 ..< reversed.count - 1 { - let nextTail = DoublyLinkedList(next: tailDoublyLinkedList, value: reversed[i]) - tailDoublyLinkedList?.previous = nextTail - tailDoublyLinkedList = nextTail - } - - self.value = first - self.next = tailDoublyLinkedList - self.next?.previous = self - } + + init(next: DoublyLinkedList?, value: T) { + self.value = value + self.next = next + self.next?.previous = self + } + + init?(array: [T]) { + let reversed = Array(array.reversed()) + guard let first = array.first else { + return nil + } + + var tailDoublyLinkedList: DoublyLinkedList? + + for i in 0 ..< reversed.count - 1 { + let nextTail = DoublyLinkedList(next: tailDoublyLinkedList, value: reversed[i]) + tailDoublyLinkedList?.previous = nextTail + tailDoublyLinkedList = nextTail + } + + self.value = first + self.next = tailDoublyLinkedList + self.next?.previous = self + } convenience init?(linkedList: LinkedList?) { - guard let linkedList = linkedList else { - return nil - } - self.init(array: linkedList.array()) + guard let linkedList = linkedList else { + return nil + } + self.init(array: linkedList.array()) } func array() -> Array { From f622eff95a2ac1dfaef36a4583df340e40a9bc14 Mon Sep 17 00:00:00 2001 From: FarzadShbfn Date: Wed, 8 Mar 2017 17:17:53 +0330 Subject: [PATCH 3/3] Use `ReversedRandomAcces` protocol directly instead of casting it into `Array` --- Sources/LinkedList.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/LinkedList.swift b/Sources/LinkedList.swift index 6c8d06d..c21abaa 100644 --- a/Sources/LinkedList.swift +++ b/Sources/LinkedList.swift @@ -9,7 +9,7 @@ class LinkedList { } init?(array: [T]) { - let reversed = Array(array.reversed()) + let reversed = array.reversed() guard let first = array.first else { return nil } @@ -17,7 +17,7 @@ class LinkedList { var tailLinkedList: LinkedList? for i in 0 ..< reversed.count - 1 { - tailLinkedList = LinkedList(next: tailLinkedList, value: reversed[i]) + tailLinkedList = LinkedList(next: tailLinkedList, value: reversed.itemOnStartIndex(advancedBy: i)) } self.next = tailLinkedList @@ -51,7 +51,7 @@ class DoublyLinkedList { } init?(array: [T]) { - let reversed = Array(array.reversed()) + let reversed = array.reversed() guard let first = array.first else { return nil } @@ -59,7 +59,7 @@ class DoublyLinkedList { var tailDoublyLinkedList: DoublyLinkedList? for i in 0 ..< reversed.count - 1 { - let nextTail = DoublyLinkedList(next: tailDoublyLinkedList, value: reversed[i]) + let nextTail = DoublyLinkedList(next: tailDoublyLinkedList, value: reversed.itemOnStartIndex(advancedBy: i)) tailDoublyLinkedList?.previous = nextTail tailDoublyLinkedList = nextTail }