diff --git a/linked-lists/kth-to-last-elem.ipynb b/linked-lists/kth-to-last-elem.ipynb index c9de9c5..444dab5 100644 --- a/linked-lists/kth-to-last-elem.ipynb +++ b/linked-lists/kth-to-last-elem.ipynb @@ -13,26 +13,31 @@ "source": [ "## Problem: Find the kth to last element of a linked list\n", "\n", - "* [Clarifying Questions](#Clarifying-Questions)\n", + "* [Constraints and Assumptions](#Constraints-and-Assumptions)\n", "* [Test Cases](#Test-Cases)\n", "* [Algorithm](#Algorithm)\n", - "* [Code](#Code)" + "* [Code](#Code)\n", + "* [Unit Test](#Unit-Test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Clarifying Questions\n", + "## Constraints and Assumptions\n", "\n", - "* Is k an integer?\n", + "*Problem statements are often intentionally ambiguous. Identifying constraints and stating assumptions can help to ensure you code the intended solution.*\n", + "\n", + "* Can we assume k is a valid integer?\n", " * Yes\n", "* If k = 0, does this return the last element?\n", " * Yes\n", "* What happens if k is greater than or equal to the length of the linked list?\n", " * Return None\n", "* Can you use additional data structures?\n", - " * No" + " * No\n", + "* Can we assume we already have a linked list class that can be used for this problem?\n", + " * Yes" ] }, { @@ -54,7 +59,6 @@ "source": [ "## Algorithm\n", "\n", - "* Check for edge cases above, returning None for errors\n", "* Setup two pointers, current and previous\n", "* Give current a headstart, incrementing it once for k = 1, twice for k = 2, etc\n", "* Increment both pointers until current reaches the end\n", @@ -74,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -85,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -95,49 +99,89 @@ " def kth_to_last_elem(self, k):\n", " if self.head is None:\n", " return\n", - " if type(k) != int:\n", - " raise ValueError('')\n", " if k >= len(self):\n", " return\n", " curr = self.head\n", " prev = self.head\n", " counter = 0\n", + " \n", + " # Give current a headstart, incrementing it \n", + " # once for k = 1, twice for k = 2, etc\n", " while counter < k:\n", " curr = curr.next\n", " counter += 1\n", " if curr is None:\n", " return\n", + " \n", + " # Increment both pointers until current reaches the end\n", " while curr.next is not None:\n", " curr = curr.next\n", " prev = prev.next\n", " return prev.data" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Unit Test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*It is important to identify and run through general and edge cases from the [Test Cases](#Test-Cases) section by hand. You generally will not be asked to write a unit test like what is shown below.*" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test: Empty list\n", + "Test: k >= len(list)\n", + "Test: One element, k = 0\n", + "Test: General case\n", + "Success: test_kth_to_last_elem\n" + ] + } + ], "source": [ - "# Empty list\n", - "linked_list = MyLinkedList(None)\n", - "print(linked_list.kth_to_last_elem(0))\n", - "# k is not an integer\n", - "print(linked_list.kth_to_last_elem('a'))\n", - "# k is >= the length of the linked list\n", - "print(linked_list.kth_to_last_elem(100))\n", - "# One element, k = 0\n", - "head = Node(2)\n", - "linked_list = MyLinkedList(head)\n", - "print(linked_list.kth_to_last_elem(0))\n", - "# General case with many elements, k < length of linked list\n", - "linked_list.insert_to_front(1)\n", - "linked_list.insert_to_front(3)\n", - "linked_list.insert_to_front(5)\n", - "linked_list.insert_to_front(7)\n", - "print(linked_list.kth_to_last_elem(2))" + "from nose.tools import assert_equal\n", + "\n", + "class Test(object):\n", + " def test_kth_to_last_elem(self):\n", + " print('Test: Empty list')\n", + " linked_list = MyLinkedList(None)\n", + " assert_equal(linked_list.kth_to_last_elem(0), None)\n", + " \n", + " print('Test: k >= len(list)')\n", + " assert_equal(linked_list.kth_to_last_elem(100), None)\n", + " \n", + " print('Test: One element, k = 0')\n", + " head = Node(2)\n", + " linked_list = MyLinkedList(head)\n", + " assert_equal(linked_list.kth_to_last_elem(0), 2)\n", + " \n", + " print('Test: General case')\n", + " linked_list.insert_to_front(1)\n", + " linked_list.insert_to_front(3)\n", + " linked_list.insert_to_front(5)\n", + " linked_list.insert_to_front(7)\n", + " assert_equal(linked_list.kth_to_last_elem(2), 3)\n", + " \n", + " print('Success: test_kth_to_last_elem')\n", + "\n", + "if __name__ == '__main__':\n", + " test = Test()\n", + " test.test_kth_to_last_elem()" ] } ],