From 1173c51318ba9bbd464bacf1abb1fead4d3e5541 Mon Sep 17 00:00:00 2001 From: Donne Martin Date: Sun, 10 May 2015 13:36:43 -0400 Subject: [PATCH] Added notebook solving the following: Delete a node in the middle, given only access to that node. --- README.md | 1 + linked-lists/delete-mid.ipynb | 161 ++++++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 linked-lists/delete-mid.ipynb diff --git a/README.md b/README.md index 31ab1bd..4eb168e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Continually updated IPython Notebooks containing algorithms and data structures. * [Linked list with insert, find, delete, and print methods](http://nbviewer.ipython.org/github/donnemartin/algorithms-data-structures/blob/master/linked-lists/linked-list.ipynb) * [Remove duplicates from a linked list](http://nbviewer.ipython.org/github/donnemartin/algorithms-data-structures/blob/master/linked-lists/remove-duplicates.ipynb) * [Find the kth to last element of a linked list](http://nbviewer.ipython.org/github/donnemartin/algorithms-data-structures/blob/master/linked-lists/kth-to-last-elem.ipynb) +* [Delete a node in the middle of a linked list, given access to only that node](http://nbviewer.ipython.org/github/donnemartin/algorithms-data-structures/blob/master/linked-lists/delete-mid.ipynb) ## License diff --git a/linked-lists/delete-mid.ipynb b/linked-lists/delete-mid.ipynb new file mode 100644 index 0000000..325f312 --- /dev/null +++ b/linked-lists/delete-mid.ipynb @@ -0,0 +1,161 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem: Delete a node in the middle, given only access to that node.\n", + "\n", + "* [Clarifying Questions](#Clarifying-Questions)\n", + "* [Test Cases](#Test-Cases)\n", + "* [Algorithm](#Algorithm)\n", + "* [Code](#Code)\n", + "* [Pythonic-Code](#Pythonic-Code)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Clarifying Questions\n", + "\n", + "* Do we assume the linked list class already exists?\n", + " * No, create one\n", + "* What if the final node is being deleted, for example a single node list?\n", + " * Make it a dummy node" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test Cases\n", + "\n", + "* Empty list\n", + "* Null node to delete\n", + "* One node\n", + "* Multiple nodes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Algorithm\n", + "\n", + "We'll need two pointers, one to the current node and one to the next node. We will copy the next node's data to the current node's data (effectively deleting the current node) and update the current node's next pointer.\n", + "\n", + "* Set curr and next pointers\n", + "* set curr.data to next.data\n", + "* set curr.next to next.next\n", + "\n", + "Complexity:\n", + "* Time: O(1)\n", + "* Space: In-place" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Node(object):\n", + " def __init__(self, data):\n", + " self.data = data\n", + " self.next = None\n", + "\n", + "class LinkedList(object):\n", + " def __init__(self, head):\n", + " self.head = head\n", + " \n", + " def delete_node(self, node):\n", + " if self.head is None:\n", + " return\n", + " if node is None:\n", + " return\n", + " next = node.next\n", + " if next is None:\n", + " node.data = None\n", + " node.next = None\n", + " else:\n", + " node.data = next.data\n", + " node.next = next.next\n", + "\n", + " \n", + " def insert_to_front(self, data):\n", + " if data is None:\n", + " return\n", + " node = Node(data)\n", + " if self.head is None:\n", + " self.head = node\n", + " else:\n", + " node.next = self.head\n", + " self.head = node\n", + " return node\n", + " \n", + " def print_list(self):\n", + " curr_node = self.head\n", + " while curr_node is not None:\n", + " print(curr_node.data)\n", + " curr_node = curr_node.next" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "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()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}