diff --git a/linked-lists/delete-mid.ipynb b/linked-lists/delete-mid.ipynb index 9b02702..db1192e 100644 --- a/linked-lists/delete-mid.ipynb +++ b/linked-lists/delete-mid.ipynb @@ -13,20 +13,25 @@ "source": [ "## Problem: Delete a node in the middle, given only access to that node.\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", - "* What if the final node is being deleted, for example a single node list?\n", - " * Make it a dummy node" + "*Problem statements are often intentionally ambiguous. Identifying constraints and stating assumptions can help to ensure you code the intended solution.*\n", + "\n", + "* What if the final node is being deleted, for example a single node list? Do we make it a dummy with a NULL value?\n", + " * Yes\n", + "* Can we assume we already have a linked list class that can be used for this problem?\n", + " * Yes" ] }, { @@ -67,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -78,9 +83,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -95,39 +100,77 @@ " return\n", " if node is None:\n", " return\n", - " next = node.next\n", - " if next is None:\n", + " node_next = node.next\n", + " if node_next is None:\n", " node.data = None\n", " node.next = None\n", " else:\n", - " node.data = next.data\n", - " node.next = next.next" + " node.data = node_next.data\n", + " node.next = node_next.next" + ] + }, + { + "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, null node to delete\n", + "Test: One node\n", + "Test: Multiple nodes\n", + "Success: test_delete_node\n" + ] + } + ], "source": [ - "# Empty list\n", - "linked_list = LinkedList(None)\n", - "linked_list.delete_node(None)\n", - "linked_list.print_list()\n", - "# One node\n", - "head = Node(2)\n", - "linked_list = LinkedList(head)\n", - "linked_list.delete_node(head)\n", - "linked_list.print_list()\n", - "# Multiple nodes\n", - "node0 = linked_list.insert_to_front(1)\n", - "node1 = linked_list.insert_to_front(3)\n", - "node2 = linked_list.insert_to_front(4)\n", - "node3 = linked_list.insert_to_front(1)\n", - "linked_list.delete_node(node2)\n", - "linked_list.print_list()" + "from nose.tools import assert_equal\n", + "\n", + "class Test(object):\n", + " def test_delete_node(self):\n", + " print('Test: Empty list, null node to delete')\n", + " linked_list = MyLinkedList(None)\n", + " linked_list.delete_node(None)\n", + " assert_equal(linked_list.get_all_data(), [])\n", + "\n", + " print('Test: One node')\n", + " head = Node(2)\n", + " linked_list = MyLinkedList(head)\n", + " linked_list.delete_node(head)\n", + " assert_equal(linked_list.get_all_data(), [None])\n", + "\n", + " print('Test: Multiple nodes')\n", + " linked_list = MyLinkedList(None) \n", + " node0 = linked_list.insert_to_front(1)\n", + " node1 = linked_list.insert_to_front(3)\n", + " node2 = linked_list.insert_to_front(4)\n", + " node3 = linked_list.insert_to_front(1)\n", + " linked_list.delete_node(node2)\n", + " assert_equal(linked_list.get_all_data(), [1, 3, 1])\n", + " \n", + " print('Success: test_delete_node')\n", + "\n", + "if __name__ == '__main__':\n", + " test = Test()\n", + " test.test_delete_node()" ] } ],