From 61cb5c29b00122142bec4dfccf625504a4937817 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Wed, 6 Sep 2017 21:59:41 -0700 Subject: [PATCH 1/2] methods implemented in Swift --- LinkedList.swift | 413 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 LinkedList.swift diff --git a/LinkedList.swift b/LinkedList.swift new file mode 100644 index 00000000..4c1765d7 --- /dev/null +++ b/LinkedList.swift @@ -0,0 +1,413 @@ +public class Node { + let data: Int + var next: Node? = nil + + init(data: Int) { + self.data = data + } +} + +public class LinkedList { + private var head: Node? + + // method to add a new node with the specific data value in the linked list + // insert the new node at the beginning of the linked list + public func insert(_ value: Int) { + let node = Node(data: value) + node.next = head + head = node + } + + // method to find if the linked list contains a node with specified value + // returns true if found, false otherwise + public func search(value: Int) -> Bool { + var node = head + + while node != nil { + if node?.data == value { + return true + } + node = node?.next + } + return false + } + + // method to return the max value in the linked list + // returns the data value and not the node + public func find_max() -> Int? { + if head == nil { + return nil + } + + var max = head?.data + var node = head + + while node != nil { + if node!.data > max! { + max = node!.data + } + node = node?.next + } + + return max + } + + // method to return the min value in the linked list + // returns the data value and not the node + public func find_min() -> Int? { + if head == nil { + return nil + } + + var min = head?.data + var node = head + + while node != nil { + if node!.data < min! { + min = node!.data + } + node = node?.next + } + + return min + } + + // method that returns the length of the singly linked list + public func length() -> Int? { + var node = head + var length = 0 + + if node == nil { + return nil + } + + while node != nil { + length += 1 + node = node?.next + } + + return length + } + + // method to return the value of the nth element from the beginning + // assume indexing starts at 0 while counting to n + public func find_nth_from_beginning(_ index: Int) -> Int? { + var node = head + var counter = 0 + + while node != nil { + if index == counter { + return node?.data + } + counter += 1 + node = node?.next + } + + return nil + } + + // method to insert a new node with specific data value, assuming the linked + // list is sorted in ascending order + public func insert_ascending(_ value: Int) { + let newNode = Node(data: value) + + if head == nil { + head = newNode + } else if newNode.data <= head!.data { + let temp = head + head = newNode + head!.next = temp + } else { + var node = head + while node?.next != nil && node!.next!.data < newNode.data { + node = node?.next + } + + newNode.next = node?.next + node?.next = newNode + } + + } + + // method to print all the values in the linked list + public func visit() { + var node = head + + while node != nil { + if let data = node?.data { + print(data) + } + node = node?.next + } + } + + // method to delete the first node found with specified value + public func delete(_ value: Int) { + if head?.data == value { + head = head?.next + } else { + var node = head + + while node?.next != nil && node?.next!.data != value { + node = node?.next + } + + if node!.next != nil { + if node?.next!.next == nil { + node?.next = nil + } else { + node?.next = node?.next?.next + } + } + } + } + + // method to reverse the singly linked list + // note: the nodes should be moved and not just the values in the nodes + public func reverse() { + var node = head + var prevNode: Node? = nil + + while node != nil { + let tempNode = node?.next + node?.next = prevNode + prevNode = node + node = tempNode + } + + head = prevNode + } + + // returns the value at the middle element in the singly linked list + public func find_middle_value() -> Int? { + var byOne = head + var byTwo = head?.next + + while byTwo != nil { + byOne = byOne?.next + byTwo = byTwo?.next?.next + } + + return byOne?.data + } + + // find the nth node from the end and return its value + // assume indexing starts at 0 while counting to n + public func find_nth_from_end(_ index: Int) -> Int? { + var node = head + + if index == 0 { + while node?.next != nil { + node = node?.next + } + return node?.data + } + + var byIndex = head?.next + + for _ in 0.. Bool { + var i = head + var j = head + while j!.next != nil { + i = i?.next + j = j?.next?.next + if i === j { + return true + } + } + return false + } + + // Creates a cycle in the linked list for testing purposes + // Assumes the linked list has at least one node + public func create_cycle() { + if head != nil { + // navigate to last node + var current = head + while current?.next != nil { + current = current?.next + } + + current?.next = head // make the last node link to first node + } + } +} + + +// test code +var my_linked_list = LinkedList() + +// Add some values to the linked list +print("Adding 5, 3 and 1 to the linked list.") +my_linked_list.insert(5) +my_linked_list.insert(3) +my_linked_list.insert(1) + +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() + +// Find the value at the nth node +print("Confirming values in the linked list using find_nth_from_beginning method.") +var value = my_linked_list.find_nth_from_beginning(2) +if value != 5 { + print("BUG: Value at index 2 should be 5 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(1) +if value != 3 { + print("BUG: Value at index 1 should be 3 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(0) +if value != 1 { + print("BUG: Value at index 0 should be 1 and is \(value!)") +} + +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() + +// Insert ascending +print("Adding 4 in ascending order.") +my_linked_list.insert_ascending(4) + +// check newly inserted value +print("Checking values by calling find_nth_from_beginning method.") +value = my_linked_list.find_nth_from_beginning(2) +if value != 4 { + print("BUG: Value at index 2 should be 4 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(3) +if value != 5 { + print("BUG: Value at index 3 should be 5 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(1) +if value != 3 { + print("BUG: Value at index 1 should be 3 and is \(value!)") +} + +// Insert ascending +print("Adding 6 in ascening order.") +my_linked_list.insert_ascending(6) + +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() + +// vaidate length +print("Confirming length of the linked list.") +var my_linked_list_length = my_linked_list.length() +if my_linked_list_length != 5 { + print("BUG: Length should be 5 and not \(my_linked_list_length!)") +} + +// find min and max +print("Confirming min and max values in the linked list.") +var min = my_linked_list.find_min() +if min != 1 { + print("BUG: Min value should be 1 and not \(min!)") +} +var max = my_linked_list.find_max() +if max != 6 { + print("BUG: Max value should be 5 and not \(max!)") +} + +// delete value +print("Deleting node with value 5 from the linked list.") +my_linked_list.delete(5) +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() +// validate length +print("Confirming length of the linked list.") +my_linked_list_length = my_linked_list.length() +if my_linked_list_length != 4 { + print("BUG: Length should be 4 and not \(my_linked_list_length!)") +} + +// delete value +print("Deleting node with value 1 from the linked list.") +my_linked_list.delete(1) +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() +// validate length +print("Confirming length of the linked list.") +my_linked_list_length = my_linked_list.length() +if my_linked_list_length != 3 { + print("BUG: Length should be 3 and not \(my_linked_list_length!)") +} + +// find middle element +print("Confirming middle value in the linked list.") +var middle = my_linked_list.find_middle_value() +if middle != 4 { + print("BUG: Middle value should be 4 and not \(middle!)") +} + +// reverse the linked list +print("Reversing the linked list.") +my_linked_list.reverse() + +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() + +// verify the reversed list +print("Verifying the reveresed linked list by calling find_nth_from_beginning method.") +value = my_linked_list.find_nth_from_beginning(2) +if value != 3 { + print("BUG: Value at index 2 should be 3 and is \(value!)") +} + +value = my_linked_list.find_nth_from_beginning(1) +if value != 4 { + print("BUG: Value at index 1 should be 4 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(0) +if value != 6 { + print("BUG: Value at index 0 should be 6 and is \(value!)") +} + +// nth from the end +print("Verifying find_nth_from_end method.") +value = my_linked_list.find_nth_from_end(0) +if value != 3 { + print("BUG: Value at index 0 from the end, should be 3 and is \(value!)") +} +value = my_linked_list.find_nth_from_end(1) +if value != 4 { + print("BUG: Value at index 1 from the end, should be 4 and is \(value!)") +} +value = my_linked_list.find_nth_from_end(2) +if value != 6 { + print("BUG: Value at index 2 from the end, should be 6 and is \(value!)") +} + +// check for cycle +print("Checking the linked list for cycle.") +if my_linked_list.has_cycle() { + print("BUG: Should not have a cycle.") +} + +// create cycle and then test for it +print("Creating a cycle in the linked list.") +my_linked_list.create_cycle() +print("Checking the linked list for cycle.") +if !my_linked_list.has_cycle() { + print("BUG: Should not have a cycle.") +} From b0042188415a7b4c84bfeafbcb076bf74d635989 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Wed, 6 Sep 2017 22:24:36 -0700 Subject: [PATCH 2/2] replacing single file with a playground --- .../Contents.swift | 826 +++++++++--------- LinkedList.playground/contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 76462 bytes 4 files changed, 424 insertions(+), 413 deletions(-) rename LinkedList.swift => LinkedList.playground/Contents.swift (95%) create mode 100644 LinkedList.playground/contents.xcplayground create mode 100644 LinkedList.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 LinkedList.playground/playground.xcworkspace/xcuserdata/bt.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/LinkedList.swift b/LinkedList.playground/Contents.swift similarity index 95% rename from LinkedList.swift rename to LinkedList.playground/Contents.swift index 4c1765d7..fc3893d4 100644 --- a/LinkedList.swift +++ b/LinkedList.playground/Contents.swift @@ -1,413 +1,413 @@ -public class Node { - let data: Int - var next: Node? = nil - - init(data: Int) { - self.data = data - } -} - -public class LinkedList { - private var head: Node? - - // method to add a new node with the specific data value in the linked list - // insert the new node at the beginning of the linked list - public func insert(_ value: Int) { - let node = Node(data: value) - node.next = head - head = node - } - - // method to find if the linked list contains a node with specified value - // returns true if found, false otherwise - public func search(value: Int) -> Bool { - var node = head - - while node != nil { - if node?.data == value { - return true - } - node = node?.next - } - return false - } - - // method to return the max value in the linked list - // returns the data value and not the node - public func find_max() -> Int? { - if head == nil { - return nil - } - - var max = head?.data - var node = head - - while node != nil { - if node!.data > max! { - max = node!.data - } - node = node?.next - } - - return max - } - - // method to return the min value in the linked list - // returns the data value and not the node - public func find_min() -> Int? { - if head == nil { - return nil - } - - var min = head?.data - var node = head - - while node != nil { - if node!.data < min! { - min = node!.data - } - node = node?.next - } - - return min - } - - // method that returns the length of the singly linked list - public func length() -> Int? { - var node = head - var length = 0 - - if node == nil { - return nil - } - - while node != nil { - length += 1 - node = node?.next - } - - return length - } - - // method to return the value of the nth element from the beginning - // assume indexing starts at 0 while counting to n - public func find_nth_from_beginning(_ index: Int) -> Int? { - var node = head - var counter = 0 - - while node != nil { - if index == counter { - return node?.data - } - counter += 1 - node = node?.next - } - - return nil - } - - // method to insert a new node with specific data value, assuming the linked - // list is sorted in ascending order - public func insert_ascending(_ value: Int) { - let newNode = Node(data: value) - - if head == nil { - head = newNode - } else if newNode.data <= head!.data { - let temp = head - head = newNode - head!.next = temp - } else { - var node = head - while node?.next != nil && node!.next!.data < newNode.data { - node = node?.next - } - - newNode.next = node?.next - node?.next = newNode - } - - } - - // method to print all the values in the linked list - public func visit() { - var node = head - - while node != nil { - if let data = node?.data { - print(data) - } - node = node?.next - } - } - - // method to delete the first node found with specified value - public func delete(_ value: Int) { - if head?.data == value { - head = head?.next - } else { - var node = head - - while node?.next != nil && node?.next!.data != value { - node = node?.next - } - - if node!.next != nil { - if node?.next!.next == nil { - node?.next = nil - } else { - node?.next = node?.next?.next - } - } - } - } - - // method to reverse the singly linked list - // note: the nodes should be moved and not just the values in the nodes - public func reverse() { - var node = head - var prevNode: Node? = nil - - while node != nil { - let tempNode = node?.next - node?.next = prevNode - prevNode = node - node = tempNode - } - - head = prevNode - } - - // returns the value at the middle element in the singly linked list - public func find_middle_value() -> Int? { - var byOne = head - var byTwo = head?.next - - while byTwo != nil { - byOne = byOne?.next - byTwo = byTwo?.next?.next - } - - return byOne?.data - } - - // find the nth node from the end and return its value - // assume indexing starts at 0 while counting to n - public func find_nth_from_end(_ index: Int) -> Int? { - var node = head - - if index == 0 { - while node?.next != nil { - node = node?.next - } - return node?.data - } - - var byIndex = head?.next - - for _ in 0.. Bool { - var i = head - var j = head - while j!.next != nil { - i = i?.next - j = j?.next?.next - if i === j { - return true - } - } - return false - } - - // Creates a cycle in the linked list for testing purposes - // Assumes the linked list has at least one node - public func create_cycle() { - if head != nil { - // navigate to last node - var current = head - while current?.next != nil { - current = current?.next - } - - current?.next = head // make the last node link to first node - } - } -} - - -// test code -var my_linked_list = LinkedList() - -// Add some values to the linked list -print("Adding 5, 3 and 1 to the linked list.") -my_linked_list.insert(5) -my_linked_list.insert(3) -my_linked_list.insert(1) - -// print all elements -print("Printing elements in the linked list:") -my_linked_list.visit() - -// Find the value at the nth node -print("Confirming values in the linked list using find_nth_from_beginning method.") -var value = my_linked_list.find_nth_from_beginning(2) -if value != 5 { - print("BUG: Value at index 2 should be 5 and is \(value!)") -} -value = my_linked_list.find_nth_from_beginning(1) -if value != 3 { - print("BUG: Value at index 1 should be 3 and is \(value!)") -} -value = my_linked_list.find_nth_from_beginning(0) -if value != 1 { - print("BUG: Value at index 0 should be 1 and is \(value!)") -} - -// print all elements -print("Printing elements in the linked list:") -my_linked_list.visit() - -// Insert ascending -print("Adding 4 in ascending order.") -my_linked_list.insert_ascending(4) - -// check newly inserted value -print("Checking values by calling find_nth_from_beginning method.") -value = my_linked_list.find_nth_from_beginning(2) -if value != 4 { - print("BUG: Value at index 2 should be 4 and is \(value!)") -} -value = my_linked_list.find_nth_from_beginning(3) -if value != 5 { - print("BUG: Value at index 3 should be 5 and is \(value!)") -} -value = my_linked_list.find_nth_from_beginning(1) -if value != 3 { - print("BUG: Value at index 1 should be 3 and is \(value!)") -} - -// Insert ascending -print("Adding 6 in ascening order.") -my_linked_list.insert_ascending(6) - -// print all elements -print("Printing elements in the linked list:") -my_linked_list.visit() - -// vaidate length -print("Confirming length of the linked list.") -var my_linked_list_length = my_linked_list.length() -if my_linked_list_length != 5 { - print("BUG: Length should be 5 and not \(my_linked_list_length!)") -} - -// find min and max -print("Confirming min and max values in the linked list.") -var min = my_linked_list.find_min() -if min != 1 { - print("BUG: Min value should be 1 and not \(min!)") -} -var max = my_linked_list.find_max() -if max != 6 { - print("BUG: Max value should be 5 and not \(max!)") -} - -// delete value -print("Deleting node with value 5 from the linked list.") -my_linked_list.delete(5) -// print all elements -print("Printing elements in the linked list:") -my_linked_list.visit() -// validate length -print("Confirming length of the linked list.") -my_linked_list_length = my_linked_list.length() -if my_linked_list_length != 4 { - print("BUG: Length should be 4 and not \(my_linked_list_length!)") -} - -// delete value -print("Deleting node with value 1 from the linked list.") -my_linked_list.delete(1) -// print all elements -print("Printing elements in the linked list:") -my_linked_list.visit() -// validate length -print("Confirming length of the linked list.") -my_linked_list_length = my_linked_list.length() -if my_linked_list_length != 3 { - print("BUG: Length should be 3 and not \(my_linked_list_length!)") -} - -// find middle element -print("Confirming middle value in the linked list.") -var middle = my_linked_list.find_middle_value() -if middle != 4 { - print("BUG: Middle value should be 4 and not \(middle!)") -} - -// reverse the linked list -print("Reversing the linked list.") -my_linked_list.reverse() - -// print all elements -print("Printing elements in the linked list:") -my_linked_list.visit() - -// verify the reversed list -print("Verifying the reveresed linked list by calling find_nth_from_beginning method.") -value = my_linked_list.find_nth_from_beginning(2) -if value != 3 { - print("BUG: Value at index 2 should be 3 and is \(value!)") -} - -value = my_linked_list.find_nth_from_beginning(1) -if value != 4 { - print("BUG: Value at index 1 should be 4 and is \(value!)") -} -value = my_linked_list.find_nth_from_beginning(0) -if value != 6 { - print("BUG: Value at index 0 should be 6 and is \(value!)") -} - -// nth from the end -print("Verifying find_nth_from_end method.") -value = my_linked_list.find_nth_from_end(0) -if value != 3 { - print("BUG: Value at index 0 from the end, should be 3 and is \(value!)") -} -value = my_linked_list.find_nth_from_end(1) -if value != 4 { - print("BUG: Value at index 1 from the end, should be 4 and is \(value!)") -} -value = my_linked_list.find_nth_from_end(2) -if value != 6 { - print("BUG: Value at index 2 from the end, should be 6 and is \(value!)") -} - -// check for cycle -print("Checking the linked list for cycle.") -if my_linked_list.has_cycle() { - print("BUG: Should not have a cycle.") -} - -// create cycle and then test for it -print("Creating a cycle in the linked list.") -my_linked_list.create_cycle() -print("Checking the linked list for cycle.") -if !my_linked_list.has_cycle() { - print("BUG: Should not have a cycle.") -} +public class Node { + let data: Int + var next: Node? = nil + + init(data: Int) { + self.data = data + } +} + +public class LinkedList { + private var head: Node? + + // method to add a new node with the specific data value in the linked list + // insert the new node at the beginning of the linked list + public func insert(_ value: Int) { + let node = Node(data: value) + node.next = head + head = node + } + + // method to find if the linked list contains a node with specified value + // returns true if found, false otherwise + public func search(value: Int) -> Bool { + var node = head + + while node != nil { + if node?.data == value { + return true + } + node = node?.next + } + return false + } + + // method to return the max value in the linked list + // returns the data value and not the node + public func find_max() -> Int? { + if head == nil { + return nil + } + + var max = head?.data + var node = head + + while node != nil { + if node!.data > max! { + max = node!.data + } + node = node?.next + } + + return max + } + + // method to return the min value in the linked list + // returns the data value and not the node + public func find_min() -> Int? { + if head == nil { + return nil + } + + var min = head?.data + var node = head + + while node != nil { + if node!.data < min! { + min = node!.data + } + node = node?.next + } + + return min + } + + // method that returns the length of the singly linked list + public func length() -> Int? { + var node = head + var length = 0 + + if node == nil { + return nil + } + + while node != nil { + length += 1 + node = node?.next + } + + return length + } + + // method to return the value of the nth element from the beginning + // assume indexing starts at 0 while counting to n + public func find_nth_from_beginning(_ index: Int) -> Int? { + var node = head + var counter = 0 + + while node != nil { + if index == counter { + return node?.data + } + counter += 1 + node = node?.next + } + + return nil + } + + // method to insert a new node with specific data value, assuming the linked + // list is sorted in ascending order + public func insert_ascending(_ value: Int) { + let newNode = Node(data: value) + + if head == nil { + head = newNode + } else if newNode.data <= head!.data { + let temp = head + head = newNode + head!.next = temp + } else { + var node = head + while node?.next != nil && node!.next!.data < newNode.data { + node = node?.next + } + + newNode.next = node?.next + node?.next = newNode + } + + } + + // method to print all the values in the linked list + public func visit() { + var node = head + + while node != nil { + if let data = node?.data { + print(data) + } + node = node?.next + } + } + + // method to delete the first node found with specified value + public func delete(_ value: Int) { + if head?.data == value { + head = head?.next + } else { + var node = head + + while node?.next != nil && node?.next!.data != value { + node = node?.next + } + + if node!.next != nil { + if node?.next!.next == nil { + node?.next = nil + } else { + node?.next = node?.next?.next + } + } + } + } + + // method to reverse the singly linked list + // note: the nodes should be moved and not just the values in the nodes + public func reverse() { + var node = head + var prevNode: Node? = nil + + while node != nil { + let tempNode = node?.next + node?.next = prevNode + prevNode = node + node = tempNode + } + + head = prevNode + } + + // returns the value at the middle element in the singly linked list + public func find_middle_value() -> Int? { + var byOne = head + var byTwo = head?.next + + while byTwo != nil { + byOne = byOne?.next + byTwo = byTwo?.next?.next + } + + return byOne?.data + } + + // find the nth node from the end and return its value + // assume indexing starts at 0 while counting to n + public func find_nth_from_end(_ index: Int) -> Int? { + var node = head + + if index == 0 { + while node?.next != nil { + node = node?.next + } + return node?.data + } + + var byIndex = head?.next + + for _ in 0.. Bool { + var i = head + var j = head + while j!.next != nil { + i = i?.next + j = j?.next?.next + if i === j { + return true + } + } + return false + } + + // Creates a cycle in the linked list for testing purposes + // Assumes the linked list has at least one node + public func create_cycle() { + if head != nil { + // navigate to last node + var current = head + while current?.next != nil { + current = current?.next + } + + current?.next = head // make the last node link to first node + } + } +} + + +// test code +var my_linked_list = LinkedList() + +// Add some values to the linked list +print("Adding 5, 3 and 1 to the linked list.") +my_linked_list.insert(5) +my_linked_list.insert(3) +my_linked_list.insert(1) + +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() + +// Find the value at the nth node +print("Confirming values in the linked list using find_nth_from_beginning method.") +var value = my_linked_list.find_nth_from_beginning(2) +if value != 5 { + print("BUG: Value at index 2 should be 5 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(1) +if value != 3 { + print("BUG: Value at index 1 should be 3 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(0) +if value != 1 { + print("BUG: Value at index 0 should be 1 and is \(value!)") +} + +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() + +// Insert ascending +print("Adding 4 in ascending order.") +my_linked_list.insert_ascending(4) + +// check newly inserted value +print("Checking values by calling find_nth_from_beginning method.") +value = my_linked_list.find_nth_from_beginning(2) +if value != 4 { + print("BUG: Value at index 2 should be 4 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(3) +if value != 5 { + print("BUG: Value at index 3 should be 5 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(1) +if value != 3 { + print("BUG: Value at index 1 should be 3 and is \(value!)") +} + +// Insert ascending +print("Adding 6 in ascening order.") +my_linked_list.insert_ascending(6) + +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() + +// vaidate length +print("Confirming length of the linked list.") +var my_linked_list_length = my_linked_list.length() +if my_linked_list_length != 5 { + print("BUG: Length should be 5 and not \(my_linked_list_length!)") +} + +// find min and max +print("Confirming min and max values in the linked list.") +var min = my_linked_list.find_min() +if min != 1 { + print("BUG: Min value should be 1 and not \(min!)") +} +var max = my_linked_list.find_max() +if max != 6 { + print("BUG: Max value should be 5 and not \(max!)") +} + +// delete value +print("Deleting node with value 5 from the linked list.") +my_linked_list.delete(5) +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() +// validate length +print("Confirming length of the linked list.") +my_linked_list_length = my_linked_list.length() +if my_linked_list_length != 4 { + print("BUG: Length should be 4 and not \(my_linked_list_length!)") +} + +// delete value +print("Deleting node with value 1 from the linked list.") +my_linked_list.delete(1) +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() +// validate length +print("Confirming length of the linked list.") +my_linked_list_length = my_linked_list.length() +if my_linked_list_length != 3 { + print("BUG: Length should be 3 and not \(my_linked_list_length!)") +} + +// find middle element +print("Confirming middle value in the linked list.") +var middle = my_linked_list.find_middle_value() +if middle != 4 { + print("BUG: Middle value should be 4 and not \(middle!)") +} + +// reverse the linked list +print("Reversing the linked list.") +my_linked_list.reverse() + +// print all elements +print("Printing elements in the linked list:") +my_linked_list.visit() + +// verify the reversed list +print("Verifying the reveresed linked list by calling find_nth_from_beginning method.") +value = my_linked_list.find_nth_from_beginning(2) +if value != 3 { + print("BUG: Value at index 2 should be 3 and is \(value!)") +} + +value = my_linked_list.find_nth_from_beginning(1) +if value != 4 { + print("BUG: Value at index 1 should be 4 and is \(value!)") +} +value = my_linked_list.find_nth_from_beginning(0) +if value != 6 { + print("BUG: Value at index 0 should be 6 and is \(value!)") +} + +// nth from the end +print("Verifying find_nth_from_end method.") +value = my_linked_list.find_nth_from_end(0) +if value != 3 { + print("BUG: Value at index 0 from the end, should be 3 and is \(value!)") +} +value = my_linked_list.find_nth_from_end(1) +if value != 4 { + print("BUG: Value at index 1 from the end, should be 4 and is \(value!)") +} +value = my_linked_list.find_nth_from_end(2) +if value != 6 { + print("BUG: Value at index 2 from the end, should be 6 and is \(value!)") +} + +// check for cycle +print("Checking the linked list for cycle.") +if my_linked_list.has_cycle() { + print("BUG: Should not have a cycle.") +} + +// create cycle and then test for it +print("Creating a cycle in the linked list.") +my_linked_list.create_cycle() +print("Checking the linked list for cycle.") +if !my_linked_list.has_cycle() { + print("BUG: Should not have a cycle.") +} diff --git a/LinkedList.playground/contents.xcplayground b/LinkedList.playground/contents.xcplayground new file mode 100644 index 00000000..5da2641c --- /dev/null +++ b/LinkedList.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/LinkedList.playground/playground.xcworkspace/contents.xcworkspacedata b/LinkedList.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/LinkedList.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/LinkedList.playground/playground.xcworkspace/xcuserdata/bt.xcuserdatad/UserInterfaceState.xcuserstate b/LinkedList.playground/playground.xcworkspace/xcuserdata/bt.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..3650a2cda0caf3490c6fc27311a0dae4b0fa3b67 GIT binary patch literal 76462 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 literal 0 HcmV?d00001