From 219e2258ac88f72964767bdec032257f77ec49b4 Mon Sep 17 00:00:00 2001 From: AnastasiaStr Date: Wed, 31 May 2017 08:40:12 +0300 Subject: [PATCH 1/2] Adding examples on Swift. --- Swift/Double.playground/Contents.swift | 92 ++++++++++++++++++ Swift/Double.playground/contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 7945 bytes 4 files changed, 103 insertions(+) create mode 100644 Swift/Double.playground/Contents.swift create mode 100644 Swift/Double.playground/contents.xcplayground create mode 100644 Swift/Double.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 Swift/Double.playground/playground.xcworkspace/xcuserdata/anastasia.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/Swift/Double.playground/Contents.swift b/Swift/Double.playground/Contents.swift new file mode 100644 index 0000000..6575e1c --- /dev/null +++ b/Swift/Double.playground/Contents.swift @@ -0,0 +1,92 @@ +import Foundation + +class Node { + var data: String + + var next: Node? + weak var previous: Node? // weak to avoid memory leak. ARC do the trick. + // Every Node knows only its neighbours + init(with data: String) { + self.data = data + } +} + +class LinkedList { + private var head: Node? + private var tail: Node? // List knows its head and tail. + + var isEmpty: Bool { + return head == nil + } + + var first: Node? { + return head + } + + var last: Node? { + return tail + } + + func append(value: String) { + let newNode = Node(with: value) + + if let tailNode = tail { // if tail exist + newNode.previous = tailNode + tailNode.next = newNode + } + else { + head = newNode // This is the first append + } + tail = newNode + } + + func printList() { + var text = "[" + var node = head + + while node != nil { + text += "\(node!.data)" + node = node!.next + if node != nil { text += ", " } + } + text += "]" + print(text) + } + + + func removeAll() { // When head and tail is nil, weak ref will automatically delete its references one by one. + head = nil + tail = nil + } + + + func node(at index: Int) -> Node? { + if index >= 0 { + var node = head + var i = index + + while node != nil { + if i == 0 { return node } // Iterating over the List + i -= 1 + node = node!.next + } + } + return nil + } + +} + + +let myList = LinkedList() + +myList.append(value: "1231") +myList.append(value: "Car") +myList.append(value: "Dog") +myList.append(value: "Harry Potter") + +myList.printList() // [1231, Car, Dog, Harry Potter] +let secondNode = myList.node(at: 1)?.data // Car + +myList.removeAll() + +myList.printList() // [] diff --git a/Swift/Double.playground/contents.xcplayground b/Swift/Double.playground/contents.xcplayground new file mode 100644 index 0000000..5da2641 --- /dev/null +++ b/Swift/Double.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Swift/Double.playground/playground.xcworkspace/contents.xcworkspacedata b/Swift/Double.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Swift/Double.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Swift/Double.playground/playground.xcworkspace/xcuserdata/anastasia.xcuserdatad/UserInterfaceState.xcuserstate b/Swift/Double.playground/playground.xcworkspace/xcuserdata/anastasia.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..49e8959ddfc84f540d87f55400873ed3f7a2a3e8 GIT binary patch literal 7945 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 Date: Mon, 5 Jun 2017 15:31:21 +0300 Subject: [PATCH 2/2] Fixed some issues --- Swift/Double.playground/Contents.swift | 117 +++++++++++------- Swift/Double.playground/contents.xcplayground | 2 +- .../UserInterfaceState.xcuserstate | Bin 7945 -> 7215 bytes 3 files changed, 71 insertions(+), 48 deletions(-) diff --git a/Swift/Double.playground/Contents.swift b/Swift/Double.playground/Contents.swift index 6575e1c..e8c4921 100644 --- a/Swift/Double.playground/Contents.swift +++ b/Swift/Double.playground/Contents.swift @@ -1,92 +1,115 @@ import Foundation -class Node { - var data: String +public class LinkedList { - var next: Node? - weak var previous: Node? // weak to avoid memory leak. ARC do the trick. - // Every Node knows only its neighbours - init(with data: String) { - self.data = data + public class Node { + var data: T + var next: Node? + weak var previous: Node? // weak to avoid memory leak. ARC do the trick. + // Every Node knows only its neighbours + + init(data: T) { + self.data = data + } } -} - -class LinkedList { - private var head: Node? - private var tail: Node? // List knows its head and tail. - var isEmpty: Bool { + fileprivate var head: Node? + private var tail: Node? // List knows its head and tail. + + public var isEmpty: Bool { return head == nil } - var first: Node? { + public var first: Node? { return head } - var last: Node? { + public var last: Node? { return tail } - func append(value: String) { - let newNode = Node(with: value) - - if let tailNode = tail { // if tail exist + public func append(data: T) { + let newNode = Node(data: data) + if let tailNode = tail { newNode.previous = tailNode tailNode.next = newNode - } - else { - head = newNode // This is the first append + } else { + head = newNode } tail = newNode } - func printList() { - var text = "[" - var node = head - - while node != nil { - text += "\(node!.data)" - node = node!.next - if node != nil { text += ", " } - } - text += "]" - print(text) - } - - func removeAll() { // When head and tail is nil, weak ref will automatically delete its references one by one. + func removeAll() { // When head and tail is nil, weak ref will automatically delete its references one by one. head = nil tail = nil } + public func remove(node: Node) -> T { + let prev = node.previous + let next = node.next + + if let prev = prev { + prev.next = next + } else { + head = next + } + next?.previous = prev + + if next == nil { + tail = prev + } + + node.previous = nil + node.next = nil + + return node.data + } + - func node(at index: Int) -> Node? { + public func nodeAt(index: Int) -> Node? { if index >= 0 { var node = head var i = index - while node != nil { - if i == 0 { return node } // Iterating over the List + if i == 0 { return node } i -= 1 node = node!.next } } return nil } +} + +extension LinkedList: CustomStringConvertible { + public var description: String { + + var text = "[" + var node = head + + while node != nil { + text += "\(node!.data)" + node = node!.next + if node != nil { text += ", " } + } + + return text + "]" + } } -let myList = LinkedList() +let myList = LinkedList() + -myList.append(value: "1231") -myList.append(value: "Car") -myList.append(value: "Dog") -myList.append(value: "Harry Potter") +myList.append(data: 1231) +myList.append(data: 3) +myList.append(data: 5) +myList.append(data: 10) -myList.printList() // [1231, Car, Dog, Harry Potter] -let secondNode = myList.node(at: 1)?.data // Car +print(myList) // [1231, 3, 5, 10] +let secondNode = myList.nodeAt(index: 1)?.data // 3 myList.removeAll() -myList.printList() // [] +print(myList) // [] diff --git a/Swift/Double.playground/contents.xcplayground b/Swift/Double.playground/contents.xcplayground index 5da2641..63b6dd8 100644 --- a/Swift/Double.playground/contents.xcplayground +++ b/Swift/Double.playground/contents.xcplayground @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/Swift/Double.playground/playground.xcworkspace/xcuserdata/anastasia.xcuserdatad/UserInterfaceState.xcuserstate b/Swift/Double.playground/playground.xcworkspace/xcuserdata/anastasia.xcuserdatad/UserInterfaceState.xcuserstate index 49e8959ddfc84f540d87f55400873ed3f7a2a3e8..e5e04c94e077051819acdf11df63e067a194d208 100644 GIT binary patch delta 4283 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 dIyxd9369~8(T