def is_palindrome(linked_list): """Checks if linked_list is a palindrome. Creates a second linked list to store the first half of input in reverse order. Then compares the second half of input with second linked list. Args: linked_list: An instance object of tyep LinkedList. Return: True if palindrome, false otherwise. """ if not linked_list.head or not linked_list.head.next_node: return True # Consider an empty linked list a palindrome current = linked_list.head n = 0 while current: current = current.next_node n += 1 k = n // 2 current = linked_list.head reverse_linked_list = LinkedList() while k: reverse_linked_list.insert_at_head(current.data) current = current.next_node k -= 1 if n % 2 == 1: current = current.next_node p = reverse_linked_list.head while p: if p.data != current.data: return False p = p.next_node current = current.next_node return True
def add_linkedlist_nums(linked_list1, linked_list2): """Returns sum of two linked lists representing numbers. Args: linked_list1: First number. A LinkedList instance object. linked_list2: Second number. A LinkedList instance object. Returns: Sum as a LinkedList instance object. """ sum_linked_list = LinkedList() current1 = linked_list1.head current2 = linked_list2.head current3 = None carry = 0 while current1 or current2: subsum = carry if current1: subsum += current1.data current1 = current1.next_node if current2: subsum += current2.data current2 = current2.next_node carry = subsum // 10 node = Node(subsum % 10) if not current3: sum_linked_list.head = node current3 = node else: current3.next_node = node current3 = node if carry == 1: node = Node(1) current3.next_node = node return sum_linked_list
def test_find_loop_slow_fast(self): linked_list = LinkedList() linked_list.insert_at_head(3) linked_list.insert_at_head(2) linked_list.insert_at_head(1) n1 = linked_list.head n2 = n1.next_node n3 = n2.next_node n3.next_node = n1 self.assertEqual(find_loop_slow_fast(linked_list), 1) n3.next_node = n2 self.assertEqual(find_loop_slow_fast(linked_list), 2) n3.next_node = n3 self.assertEqual(find_loop_slow_fast(linked_list), 3)
def test_kth_element_to_last(self): linked_list = LinkedList() self.assertEqual(kth_element_to_last(None, 1), None) self.assertEqual(kth_element_to_last(linked_list, 1), None) linked_list.insert_at_head(3) self.assertEqual(kth_element_to_last(linked_list, 0), None) self.assertEqual(kth_element_to_last(linked_list, 1), 3) self.assertEqual(kth_element_to_last(linked_list, 2), None) linked_list.insert_at_head(2) self.assertEqual(kth_element_to_last(linked_list, 0), None) self.assertEqual(kth_element_to_last(linked_list, 1), 3) self.assertEqual(kth_element_to_last(linked_list, 2), 2) self.assertEqual(kth_element_to_last(linked_list, 3), None)
def test_insert_convert(self): linked_list = LinkedList() self.assertEqual(linked_list.convert_to_list(), []) linked_list.insert_at_head(3) self.assertEqual(linked_list.convert_to_list(), [3]) linked_list.insert_at_head(2) self.assertEqual(linked_list.convert_to_list(), [2, 3]) linked_list.insert_at_head(1) self.assertEqual(linked_list.convert_to_list(), [1, 2, 3])
def test_del_intermediate_node(self): self.assertFalse(del_intermediate_node(None)) linked_list = LinkedList() n = linked_list.head self.assertFalse(del_intermediate_node(n)) linked_list = LinkedList() linked_list.insert_at_head(3) self.assertEqual(linked_list.convert_to_list(), [3]) n = linked_list.head self.assertFalse(del_intermediate_node(n)) self.assertEqual(linked_list.convert_to_list(), [3]) linked_list = LinkedList() linked_list.insert_at_head(3) linked_list.insert_at_head(2) self.assertEqual(linked_list.convert_to_list(), [2, 3]) n = linked_list.head self.assertTrue(del_intermediate_node(n)) self.assertEqual(linked_list.convert_to_list(), [3]) linked_list = LinkedList() linked_list.insert_at_head(3) linked_list.insert_at_head(2) linked_list.insert_at_head(1) self.assertEqual(linked_list.convert_to_list(), [1, 2, 3]) n = linked_list.head.next_node.next_node self.assertFalse(del_intermediate_node(n)) self.assertTrue(linked_list.convert_to_list()) linked_list = LinkedList() linked_list.insert_at_head(3) linked_list.insert_at_head(2) linked_list.insert_at_head(1) self.assertEqual(linked_list.convert_to_list(), [1, 2, 3]) n = linked_list.head.next_node self.assertTrue(del_intermediate_node(n)) self.assertEqual(linked_list.convert_to_list(), [1, 3]) linked_list = LinkedList() linked_list.insert_at_head(3) linked_list.insert_at_head(2) linked_list.insert_at_head(1) self.assertEqual(linked_list.convert_to_list(), [1, 2, 3]) n = linked_list.head self.assertTrue(del_intermediate_node(n)) self.assertEqual(linked_list.convert_to_list(), [2, 3])
def test_is_palindrome_linkedlist(self): linked_list = LinkedList() self.assertTrue(is_palindrome(linked_list)) linked_list.insert_at_head(1) self.assertTrue(is_palindrome(linked_list)) linked_list.insert_at_head(1) self.assertTrue(is_palindrome(linked_list)) linked_list.insert_at_head(2) self.assertFalse(is_palindrome(linked_list)) linked_list.insert_at_head(1) self.assertFalse(is_palindrome(linked_list)) linked_list.insert_at_head(1) self.assertTrue(is_palindrome(linked_list)) linked_list.insert_at_head(1) self.assertFalse(is_palindrome(linked_list))
def test_partition_linkedlist(self): self.assertIsNone(partition(None, 1)) linked_list = LinkedList() self.assertEqual(linked_list.convert_to_list(), []) p_linked_list = partition(linked_list, 1) self.assertIs(p_linked_list, linked_list) self.assertEqual(p_linked_list.convert_to_list(), []) linked_list = LinkedList() linked_list.insert_at_head(3) self.assertEqual(linked_list.convert_to_list(), [3]) p_linked_list = partition(linked_list, 1) self.assertIs(p_linked_list, linked_list) self.assertEqual(p_linked_list.convert_to_list(), [3]) linked_list = LinkedList() linked_list.insert_at_head(3) self.assertEqual(linked_list.convert_to_list(), [3]) p_linked_list = partition(linked_list, 3) self.assertIs(p_linked_list, linked_list) self.assertEqual(p_linked_list.convert_to_list(), [3]) linked_list = LinkedList() linked_list.insert_at_head(3) self.assertEqual(linked_list.convert_to_list(), [3]) p_linked_list = partition(linked_list, 5) self.assertIs(p_linked_list, linked_list) self.assertEqual(p_linked_list.convert_to_list(), [3]) linked_list = LinkedList() linked_list.insert_at_head(30) linked_list.insert_at_head(20) linked_list.insert_at_head(10) self.assertEqual(linked_list.convert_to_list(), [10, 20, 30]) p_linked_list = partition(linked_list, 10) self.assertIs(p_linked_list, linked_list) self.assertEqual(p_linked_list.convert_to_list(), [30, 10, 20]) linked_list = LinkedList() linked_list.insert_at_head(30) linked_list.insert_at_head(20) linked_list.insert_at_head(10) self.assertEqual(linked_list.convert_to_list(), [10, 20, 30]) p_linked_list = partition(linked_list, 20) self.assertIs(p_linked_list, linked_list) self.assertEqual(p_linked_list.convert_to_list(), [10, 30, 20]) linked_list = LinkedList() linked_list.insert_at_head(30) linked_list.insert_at_head(20) linked_list.insert_at_head(10) self.assertEqual(linked_list.convert_to_list(), [10, 20, 30]) p_linked_list = partition(linked_list, 30) self.assertIs(p_linked_list, linked_list) self.assertEqual(p_linked_list.convert_to_list(), [10, 20, 30]) linked_list = LinkedList() linked_list.insert_at_head(30) linked_list.insert_at_head(20) linked_list.insert_at_head(10) self.assertEqual(linked_list.convert_to_list(), [10, 20, 30]) p_linked_list = partition(linked_list, 40) self.assertIs(p_linked_list, linked_list) self.assertEqual(p_linked_list.convert_to_list(), [10, 20, 30])
def test_add_linkedlist_nums(self): l1 = LinkedList() l2 = LinkedList() l3 = add_linkedlist_nums(l1, l2) self.assertEqual(l3.convert_to_list(), []) l1 = LinkedList() l2 = LinkedList() l1.insert_at_head(1) l3 = add_linkedlist_nums(l1, l2) self.assertEqual(l3.convert_to_list(), [1]) l1 = LinkedList() l2 = LinkedList() l2.insert_at_head(1) l3 = add_linkedlist_nums(l1, l2) self.assertEqual(l3.convert_to_list(), [1]) l1 = LinkedList() l2 = LinkedList() l1.insert_at_head(9) l2.insert_at_head(9) l3 = add_linkedlist_nums(l1, l2) self.assertEqual(l3.convert_to_list(), [8, 1]) l1 = LinkedList() l2 = LinkedList() l1.insert_at_head(9) l1.insert_at_head(9) l2.insert_at_head(1) l3 = add_linkedlist_nums(l1, l2) self.assertEqual(l3.convert_to_list(), [0, 0, 1])
def test_remove_duplicates(self): linked_list = LinkedList() remove_duplicates(linked_list) self.assertEqual(linked_list.convert_to_list(), []) linked_list.insert_at_head(3) remove_duplicates(linked_list) self.assertEqual(linked_list.convert_to_list(), [3]) linked_list.insert_at_head(3) remove_duplicates(linked_list) self.assertEqual(linked_list.convert_to_list(), [3]) linked_list.insert_at_head(2) remove_duplicates(linked_list) self.assertEqual(linked_list.convert_to_list(), [2, 3]) linked_list.insert_at_head(3) remove_duplicates(linked_list) self.assertEqual(linked_list.convert_to_list(), [3, 2]) for i in [4, 3, 2, 1]: linked_list.insert_at_head(i) remove_duplicates(linked_list) self.assertEqual(linked_list.convert_to_list(), [1, 2, 3, 4])