{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem: Find the kth to last element of a linked list\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", "* Do we assume the linked list class already exists?\n", " * No, create one\n", "* Is k an integer?\n", " * Yes\n", "* If k = 0, does this return the last element?\n", " * Yes\n", "* What happens if k is greater than or equal to the length of the linked list?\n", " * Return None\n", "* Can you insert NULL values in the list?\n", " * No\n", "* Can use additional data structures?\n", " * No" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test Cases\n", "\n", "* Empty list\n", "* k is not an integer\n", "* k is >= the length of the linked list\n", "* One element, k = 0\n", "* General case with many elements, k < length of linked list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Algorithm\n", "\n", "* Check for edge cases above, returning None for errors\n", "* Setup two pointers, current and previous\n", "* Give current a headstart, incrementing it once for k = 1, twice for k = 2, etc\n", "* Increment both pointers until current reaches the end\n", "* Return the value of previous\n", "\n", "Complexity:\n", "* Time: O(n)\n", "* Space: In-place" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Code" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "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 __len__(self):\n", " curr = self.head\n", " counter = 0\n", " while curr is not None:\n", " counter += 1\n", " curr = curr.next\n", " return counter\n", " \n", " def kth_to_last_elem(self, k):\n", " if self.head is None:\n", " return\n", " if type(k) != int:\n", " return\n", " if k >= len(self):\n", " return\n", " curr = self.head\n", " prev = self.head\n", " counter = 0\n", " while counter < k:\n", " curr = curr.next\n", " counter += 1\n", " if curr is None:\n", " return\n", " while curr.next is not None:\n", " curr = curr.next\n", " prev = prev.next\n", " return prev.data\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", "# Empty list\n", "linked_list = LinkedList(None)\n", "print(linked_list.kth_to_last_elem(0))\n", "# k is not an integer\n", "print(linked_list.kth_to_last_elem('a'))\n", "# k is >= the length of the linked list\n", "print(linked_list.kth_to_last_elem(100))\n", "# One element, k = 0\n", "head = Node(2)\n", "linked_list = LinkedList(head)\n", "print(linked_list.kth_to_last_elem(0))\n", "# General case with many elements, k < length of linked list\n", "linked_list.insert_to_front(1)\n", "linked_list.insert_to_front(3)\n", "linked_list.insert_to_front(5)\n", "linked_list.insert_to_front(7)\n", "print(linked_list.kth_to_last_elem(2))" ] } ], "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 }