mirror of
https://github.com/donnemartin/interactive-coding-challenges.git
synced 2024-03-22 13:11:13 +08:00
Added notebook solving the following: Delete a node in the middle, given only access to that node.
This commit is contained in:
parent
9ec2b6e28b
commit
1173c51318
|
@ -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
|
||||
|
||||
|
|
161
linked-lists/delete-mid.ipynb
Normal file
161
linked-lists/delete-mid.ipynb
Normal file
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user