      "        # When i and j meet, move j to the head\n",
      "        j = self.head\n",
      "        while j != i:\n",
      "            i = i.next\n",
      "            j = j.next\n",
      "        return i.data"
     ]
    },
 
</s> remove     "* j is incremented twice as fast as i\n",
    "    * If j's next is NULL, we do not have a circular list\n",
 </s> add     "* Increment i and j until they meet\n",
    "    * j is incremented twice as fast as i\n",
    "        * If j's next is NULL, we do not have a circular list\n", </s> remove     "* Check for an empty list\n",
 </s> add 
    "        \n",
    "        # Increment i and j one node at a time until \n",
    "        # they meet, which is the start of the loop\n",
      "        # When i and j meet, move j to the head\n",
      "        j = self.head\n",
    "        \n",
    "        # Increment i and j one node at a time until \n",
    "        # they meet, which is the start of the loop\n",
      "        while j != i:\n",
      "            i = i.next\n",
      "            j = j.next\n",
      "        return i.data"
     ]
    },
keep add keep keep keep keep keep keep
 Reworked notebook: Added more detail to constraints and test cases.  Reworked algorithm discussion and unit test. 
linked-lists/find-loop-start.ipynb