import unittest ################################################################################ # Solution ################################################################################ def contains_cycle(x): if not x: return False elif not x.next: return False a = x b = x.next while b.next: if a == b: return True a = a.next b = b.next.next return False ################################################################################ # Tests ################################################################################ class Test(unittest.TestCase): class LinkedListNode(object): def __init__(self, value, next=None): self.value = value self.next = next def test_linked_list_with_no_cycle(self): fourth = Test.LinkedListNode(4) third = Test.LinkedListNode(3, fourth) second = Test.LinkedListNode(2, third) first = Test.LinkedListNode(1, second) result = contains_cycle(first) self.assertFalse(result) def test_cycle_loops_to_beginning(self): fourth = Test.LinkedListNode(4) third = Test.LinkedListNode(3, fourth) second = Test.LinkedListNode(2, third) first = Test.LinkedListNode(1, second) fourth.next = first result = contains_cycle(first) self.assertTrue(result) def test_cycle_loops_to_middle(self): fifth = Test.LinkedListNode(5) fourth = Test.LinkedListNode(4, fifth) third = Test.LinkedListNode(3, fourth) second = Test.LinkedListNode(2, third) first = Test.LinkedListNode(1, second) fifth.next = third result = contains_cycle(first) self.assertTrue(result) def test_two_node_cycle_at_end(self): fifth = Test.LinkedListNode(5) fourth = Test.LinkedListNode(4, fifth) third = Test.LinkedListNode(3, fourth) second = Test.LinkedListNode(2, third) first = Test.LinkedListNode(1, second) fifth.next = fourth result = contains_cycle(first) self.assertTrue(result) def test_empty_list(self): result = contains_cycle(None) self.assertFalse(result) def test_one_element_linked_list_no_cycle(self): first = Test.LinkedListNode(1) result = contains_cycle(first) self.assertFalse(result) def test_one_element_linked_list_cycle(self): first = Test.LinkedListNode(1) first.next = first result = contains_cycle(first) self.assertTrue(result) unittest.main(verbosity=2)