コード例 #1
0
ファイル: q0207.py プロジェクト: mirzadm/ctci-5th-py
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
コード例 #2
0
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
コード例 #3
0
ファイル: test_q0206.py プロジェクト: mirzadm/ctci-5th-py
 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)
コード例 #4
0
    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)
コード例 #5
0
 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])
コード例 #6
0
ファイル: test_q0203.py プロジェクト: mirzadm/ctci-5th-py
    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])
コード例 #7
0
 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))
コード例 #8
0
    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])
コード例 #9
0
    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])
コード例 #10
0
    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])