diff --git a/README.md b/README.md index fbba8fe..3fdaf3c 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ Continually updated IPython Notebooks containing algorithms and data structures. * [Encode spaces in a string in-place](http://nbviewer.ipython.org/github/donnemartin/algorithms-data-structures/blob/master/arrays-strings/replace_char.ipynb) * [Compress a string](http://nbviewer.ipython.org/github/donnemartin/algorithms-data-structures/blob/master/arrays-strings/compress.ipynb) +## Linked Lists + +* [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) + ## License Copyright 2015 Donne Martin diff --git a/linked-lists/linked-list.ipynb b/linked-lists/linked-list.ipynb new file mode 100644 index 0000000..4a8ced0 --- /dev/null +++ b/linked-lists/linked-list.ipynb @@ -0,0 +1,217 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem: Implement a linked list with insert, find, delete, and print methods.\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", + "* Is this a singly or doubly linked list?\n", + " * Singly\n", + "* Is this a circular list?\n", + " * No\n", + "* Do we keep track of the tail or just the head?\n", + " * Just the head\n", + "* Can you insert NULL values in the list?\n", + " * No" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test Cases\n", + "\n", + "### Insert to Front\n", + "\n", + "* Insert a NULL\n", + "* Insert in an empty list\n", + "* Insert in a list with one element or more elements\n", + "\n", + "### Find\n", + "\n", + "* Coming soon\n", + "\n", + "### Delete\n", + "\n", + "* Coming soon\n", + "\n", + "### Print\n", + "\n", + "* Print an empty list\n", + "* Print a list with one or more elements" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Algorithm\n", + "\n", + "### Insert to Front\n", + "\n", + "* If the data we are inserting is NULL, return\n", + "* Create a node with the input data\n", + "* If this is an empty list\n", + " * Assign the head to the node\n", + "* Else\n", + " * Set the node.next to the head\n", + " * Set the head to the node\n", + "\n", + "Complexity:\n", + "* Time: O(1)\n", + "* Space: O(1), a new node is added\n", + "\n", + "### Find\n", + "\n", + "* Coming soon\n", + "\n", + "Complexity:\n", + "* Time: O(n)\n", + "* Space: In-place\n", + "\n", + "### Delete\n", + "\n", + "* Coming soon\n", + "\n", + "Complexity:\n", + "* Time: O(n)\n", + "* Space: In-place\n", + "\n", + "### Print\n", + "\n", + "* For each node\n", + " * Print the node's value\n", + " \n", + "Complexity:\n", + "* Time: O(n)\n", + "* Space: In-place" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Node(object):\n", + " def __init__(self, data):\n", + " self.next = None\n", + " self.data = data\n", + " \n", + " def __str__(self):\n", + " return self.data\n", + "\n", + "class LinkedList(object):\n", + " def __init__(self, head):\n", + " self.head = head\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", + "\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": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "10\n", + "bc\n", + "a\n", + "10\n" + ] + } + ], + "source": [ + "# Test insert_to_front\n", + "# Insert in an empty list\n", + "linked_list = LinkedList(None)\n", + "linked_list.insert_to_front(10)\n", + "linked_list.print_list()\n", + "# Insert a NULL\n", + "linked_list.insert_to_front(None)\n", + "linked_list.print_list()\n", + "# Insert in a list with one element or more elements\n", + "linked_list.insert_to_front('a')\n", + "linked_list.insert_to_front('bc')\n", + "linked_list.print_list()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Test empty print\n", + "linked_list = LinkedList(None)\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 +}