interactive-coding-challenges/linked-lists/delete-mid.ipynb

162 lines
4.1 KiB
Plaintext
Raw Normal View History

{
"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",
"* 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": [
"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
}