{
 "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)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Clarifying Questions\n",
    "\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",
    "* Check for error cases listed above\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": [
    "%run linked_list.py"
   ]
  },
  {
   "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 MyLinkedList(LinkedList):\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"
   ]
  },
  {
   "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
}
