def test_insert(self):
        self.one_node_linked_list.insert(self.one_node_linked_list.head,
                                         Node(128))
        self.assertEqual([1, 128], self.one_node_linked_list.to_list())

        linked_list = LinkedList()
        nodes = [Node(2), Node(4), Node(8), Node(16)]
        for idx, node in enumerate(nodes):
            if idx != len(nodes) - 1:
                node.next = nodes[idx + 1]
            else:
                node.next = None
            linked_list.add_in_tail(node)

        linked_list.insert(nodes[2], Node(32))
        self.assertListEqual([2, 4, 8, 32, 16], linked_list.to_list())

        linked_list.insert(nodes[0], Node(64))
        self.assertListEqual([2, 64, 4, 8, 32, 16], linked_list.to_list())

        linked_list.insert(nodes[3], Node(128))
        self.assertListEqual([2, 64, 4, 8, 32, 16, 128], linked_list.to_list())
        self.assertEqual(128, linked_list.tail.value)

        empty_linked_list = LinkedList()
        empty_linked_list.insert(empty_linked_list.head, Node(256))
        self.assertListEqual([256], empty_linked_list.to_list())
        self.assertEqual(empty_linked_list.head.value, 256)
        self.assertEqual(empty_linked_list.tail.value, 256)
Example #2
0
    def test_list_with_one_node(self):
        l = LinkedList()
        n = Node(1)

        l.add_in_tail(n)

        self.assertEqual(l.head, n)
        self.assertEqual(l.tail, n)
Example #3
0
    def test_find_in_end(self):
        l = LinkedList()
        h = Node(1)
        s = Node(3)

        for node in [h, Node(5), s, Node(6), s]:
            l.add_in_tail(node)

        self.assertEqual(l.find(3), s)
Example #4
0
    def test_find_in_beging(self):
        l = LinkedList()
        s = Node(3)

        l.add_in_tail(s)
        l.add_in_tail(Node(5))
        l.add_in_tail(Node(6))

        self.assertEqual(l.find(3), s)
Example #5
0
    def test_list_length(self):
        l = LinkedList()
        n = Node(1)

        l.add_in_tail(n)

        self.assertEqual(l.len(), 1)
        self.assertEqual(l.head, n)
        self.assertEqual(l.tail, n)
Example #6
0
    def test_find_all(self):
        l = LinkedList()
        s = Node(3)
        s2 = Node(3)
        s3 = Node(3)

        for node in [s, Node(5), s2, Node(6), s3]:
            l.add_in_tail(node)

        self.assertEqual(l.find_all(3), [s, s2, s3])
Example #7
0
    def test_insert_after_node_is_none_in_head_of_list(self):
        l = LinkedList()
        h = Node(1)
        t = Node(2)

        l.add_in_tail(t)
        l.insert(None, h)

        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)
Example #8
0
    def test_list_length_with_few_elements(self):
        l = LinkedList()
        h = Node(1)
        t = Node(3)

        for node in [h, Node(2), t]:
            l.add_in_tail(node)

        self.assertEqual(l.len(), 3)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)
Example #9
0
    def test_insert_after_node_is_none_in_the_tail_of_list(self):
        l = LinkedList()
        h = Node(1)
        a = Node(2)
        t = Node(3)

        l.add_in_tail(h)
        l.add_in_tail(a)
        l.insert(a, t)

        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)
Example #10
0
def sum_lists(ls1, ls2):
    if ls1.len() != ls2.len():
        return None

    node_1 = ls1.head
    node_2 = ls2.head
    result_list = LinkedList()

    while node_1 is not None and node_2 is not None:
        result_list.add_in_tail(Node(node_1.value + node_2.value))
        node_1 = node_1.next
        node_2 = node_2.next

    return result_list
Example #11
0
    def test_clean_list_with_one_element(self):
        l = LinkedList()
        h = Node(1)

        l.add_in_tail(h)

        self.assertEqual(l.len(), 1)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, h)

        l.clean()

        self.assertEqual(l.len(), 0)
        self.assertEqual(l.head, None)
        self.assertEqual(l.tail, None)
Example #12
0
    def test_delete_from_list_with_one_element(self):
        l = LinkedList()
        i = Node(1)

        l.add_in_tail(i)

        self.assertEqual(l.len(), 1)
        self.assertEqual(l.head, i)
        self.assertEqual(l.tail, i)

        l.delete(1)

        self.assertEqual(l.len(), 0)
        self.assertEqual(l.head, None)
        self.assertEqual(l.tail, None)
Example #13
0
def add_in_tail():
    linked_list = LinkedList()

    if linked_list.head is not None or linked_list.tail is not None:
        raise ValueError("Linked list created : head - {} tail - {}".format(linked_list.head, linked_list.tail))

    node_1 = Node(1)
    linked_list.add_in_tail(node_1)

    if linked_list.head != node_1:
        raise ValueError("LinkedList head == node_1 : {}".format(linked_list.head))

    if linked_list.tail != node_1:
        raise ValueError("LinkedList tail == node_1 : {}".format(linked_list.tail))

    print('Add in tail: success')
Example #14
0
    def test_clean(self):
        l = LinkedList()
        h = Node(1)
        t = Node(4)

        for node in [h, Node(2), Node(3), t]:
            l.add_in_tail(node)

        self.assertEqual(l.len(), 4)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)

        l.clean()

        self.assertEqual(l.len(), 0)
        self.assertEqual(l.head, None)
        self.assertEqual(l.tail, None)
Example #15
0
    def test_delete_all_list(self):
        l = LinkedList()
        h = Node(1)
        t = Node(1)

        for node in [h, Node(1), Node(1), Node(1), t]:
            l.add_in_tail(node)

        self.assertEqual(l.len(), 5)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)

        l.delete(1, all=True)

        self.assertEqual(l.len(), 0)
        self.assertEqual(l.head, None)
        self.assertEqual(l.tail, None)
Example #16
0
    def test_delete_all_from_tail(self):
        l = LinkedList()
        h = Node(1)
        m = Node(2)
        t = Node(3)

        for node in [h, m, Node(3), Node(3), t]:
            l.add_in_tail(node)

        self.assertEqual(l.len(), 5)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)

        l.delete(3, all=True)

        self.assertEqual(l.len(), 2)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, m)
Example #17
0
    def test_insert_after_node_is_none_in_the_body_of_list(self):
        l = LinkedList()
        h = Node(1)
        a = Node(2)
        t = Node(4)

        l.add_in_tail(h)
        l.add_in_tail(a)
        l.add_in_tail(t)

        self.assertEqual(l.len(), 3)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)

        l.insert(a, Node(3))

        self.assertEqual(l.len(), 4)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)
Example #18
0
    def test_delete_from_tail(self):
        l = LinkedList()
        h = Node(1)
        m = Node(2)
        t = Node(3)

        l.add_in_tail(h)
        l.add_in_tail(m)
        l.add_in_tail(t)

        self.assertEqual(l.len(), 3)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, t)

        l.delete(3)

        self.assertEqual(l.len(), 2)
        self.assertEqual(l.head, h)
        self.assertEqual(l.tail, m)
Example #19
0
def delete():
    """
        Удалить один первый элемент
    """
    ls = create_list({
        'name_1': 1,
        'name_2': 2,
        'name_3': 3
    })
    ls.delete(1, False)
    if ls.head.value != 2:
        raise ValueError("Удалить один первый элемент. ls.head.value != 2 : {}".format(ls.head.value))

    if ls.head.next.value != 3:
        raise ValueError("Удалить один первый элемент. ls.head.next.value != 3 : {}".format(ls.head.next.value))

    if ls.tail.value != 3:
        raise ValueError("Удалить один первый элемент. ls.tail.value != 3 : {}".format(ls.tail.value))

    """
        Удалить первый элемент, если все значения одинаковы
    """
    ls = create_list({
        'name_1': 1,
        'name_2': 1,
        'name_3': 1
    })
    ls.delete(1, False)
    if ls.head.value != 1:
        raise ValueError(
            "Удалить первый элемент, если все значения одинаковы. ls.head.value != 1 : {}"
            .format(ls.head.value)
        )

    if ls.len() != 2:
        raise ValueError(
            "Удалить первый элемент, если все значения одинаковы. ls.len() != 2 : {}"
            .format(ls.len())
        )

    if ls.tail.value != 1:
        raise ValueError(
            "Удалить первый элемент, если все значения одинаковы. ls.tail.value != 1 : {}"
            .format(ls.tail.value)
        )

    """
        Удалить два первых элемента
    """
    ls = create_list({
        'name_1': 1,
        'name_2': 1,
        'name_3': 2,
        'name_4': 3
    })
    ls.delete(1, True)
    if ls.head.value != 2:
        raise ValueError("Удалить два первых элемента. ls.head.value != 2 : {}".format(ls.head.value))

    if ls.head.next.value != 3:
        raise ValueError("Удалить два первых элемента. ls.head.next.value != 3 : {}".format(ls.head.next.value))

    if ls.tail.value != 3:
        raise ValueError("Удалить два первых элемента. ls.tail.value != 3 : {}".format(ls.tail.value))

    """
        Удалить первый и последний элементы
    """
    ls = create_list({
        'name_1': 1,
        'name_2': 2,
        'name_3': 3,
        'name_4': 1
    })
    ls.delete(1, True)
    if ls.head.value != 2:
        raise ValueError("Удалить первый и последний элементы. ls.head.value != 2 : {}".format(ls.head.value))

    if ls.head.next.value != 3:
        raise ValueError("Удалить первый и последний элементы. ls.head.next.value != 3 : {}".format(ls.head.next.value))

    if ls.tail.value != 3 or ls.tail.next is not None:
        raise ValueError(
            "Удалить первый элемент. ls.tail.value != 3: {}, ls.tail.next is not None : {}"
                .format(ls.tail.value, ls.tail.next))

    """
        Удалить последний элемент
    """
    ls = create_list({
        'name_1': 1,
        'name_2': 2,
        'name_3': 3,
        'name_4': 4
    })
    ls.delete(4, False)

    if ls.head.value != 1:
        raise ValueError("Удалить последний элемент. ls.head.value != 1 : {}".format(ls.head.value))

    if ls.tail.next is not None:
        raise ValueError("Удалить последний элемент. ls.tail.next is not None : {}".format(ls.tail.next))

    if ls.tail.value != 3:
        raise ValueError("Удалить последний элемент. ls.tail.value != 3 : {}".format(ls.tail.value))

    """
        Удалить два последних элемента
    """
    ls = create_list({
        'name_1': 1,
        'name_2': 2,
        'name_3': 3,
        'name_4': 4,
        'name_5': 4,
    })
    ls.delete(4, True)

    if ls.tail.value != 3 or ls.tail.next is not None:
        raise ValueError(
            "Удалить два последних элемента. ls.tail.value != 3: {}, ls.tail.next is not None: {}"
                .format(ls.tail.value, ls.tail.next)
        )

    if ls.head.value != 1:
        raise ValueError(
            "Удалить два последних элемента. ls.head.value != 1: {}"
                .format(ls.head.value)
        )

    """
        Удалить элемент в середине
    """
    ls = create_list({
        'name_1': 1,
        'name_2': 2,
        'name_3': 3,
        'name_4': 4
    })
    ls.delete(2, False)
    if ls.find(1).next.value != 3:
        raise ValueError(
            "Удалить элемент в середине. ls.find(1).next.value != 3 : {}"
            .format(ls.find(1).next.value)
        )

    """
        Удалить два элемента в середине
    """
    ls = create_list({
        'name_1': 1,
        'name_2': 2,
        'name_3': 3,
        'name_4': 3,
        'name_5': 4
    })
    ls.delete(3, True)
    if ls.find(2).next.value != 4:
        raise ValueError(
            "Удалить два элемента в середине. ls.find(1).next.value != 3 : {}"
                .format(ls.find(2).next.value)
        )

    """
        Список пустой
    """
    ls = LinkedList()
    ls.delete(1)

    """
        Один элемент в списке
    """
    ls = LinkedList()
    ls.add_in_tail(Node(1))
    ls.delete(1)
    if ls.head is not None or ls.tail is not None:
        raise ValueError("Один элемент в списке. head == None: {}, tail == None: {}".format(ls.head, ls.tail))

    print('Delete: success')
Example #20
0
def create_list(node_names):
    linked_list = LinkedList()
    for i in node_names.values():
        linked_list.add_in_tail(Node(i))

    return linked_list
Example #21
0
def insert():
    """
        Вставка в пустой список
    """
    ls = LinkedList()
    node_test = Node('test')
    ls.insert(None, node_test)

    if ls.head != node_test or ls.tail != node_test:
        raise ValueError("Вставка в пустой список. ls.head != node_test: {}".format(ls.head))

    """
        Вставка перед первым элементом
    """
    ls = LinkedList()
    node_1 = Node(1)
    node_test = Node('test')
    ls.add_in_tail(node_1)
    ls.insert(None, node_test)

    if ls.head != node_test:
        raise ValueError("Вставка перед первым элементом. ls.head != node_test: {}".format(ls.head))

    if ls.head.next != node_1:
        raise ValueError("Вставка перед первым элементом. ls.head.next != node_1: {}".format(ls.head.next))

    if ls.tail != node_1:
        raise ValueError("Вставка перед первым элементом. ls.tail != node_1: {}".format(ls.tail))

    """
        Вставка после первого элемента
    """
    node_1 = Node(1)
    node_2 = Node(2)
    node_3 = Node(3)
    node_test = Node('test')
    ls = LinkedList()
    ls.add_in_tail(node_1)
    ls.add_in_tail(node_2)
    ls.add_in_tail(node_3)
    ls.insert(node_1, node_test)

    if node_1.next != node_test:
        raise ValueError("Вставка после первого элемента. node_1.next != node_test: {}".format(node_1.next))

    if ls.head != node_1 or ls.tail != node_3:
        raise ValueError(
            "Вставка после первого элемента. ls.head != node_1: {}, ls.tail != node_3: {}"
            .format(ls.head.value, ls.tail.value)
        )

    """
        Вставка по середине
    """
    node_1 = Node(1)
    node_2 = Node(2)
    node_3 = Node(3)
    node_test = Node('test')
    ls = LinkedList()
    ls.add_in_tail(node_1)
    ls.add_in_tail(node_2)
    ls.add_in_tail(node_3)
    ls.insert(node_2, node_test)

    if node_2.next != node_test:
        raise ValueError("Вставка по середине. node_2.next != node_tes: {}".format(node_2.next))

    if node_test.next != node_3:
        raise ValueError("Вставка по середине. node_test.next != node_3: {}".format(node_test.next))

    if ls.head != node_1 or ls.tail != node_3:
        raise ValueError(
            "Вставка по середине. ls.head != node_1: {}, ls.tail != node_3: {}"
            .format(ls.head.value, ls.tail.value)
        )
    """
        Вставка в конце
    """
    node_1 = Node(1)
    node_2 = Node(2)
    node_3 = Node(3)
    node_test = Node('test')
    ls = LinkedList()
    ls.add_in_tail(node_1)
    ls.add_in_tail(node_2)
    ls.add_in_tail(node_3)
    ls.insert(node_3, node_test)

    if node_3.next != node_test:
        raise ValueError("Вставка в конце. node_3.next != node_test: {}".format(node_3.next.value))

    if node_test.next is not None:
        raise ValueError("Вставка в конце. node_test.next is not None: {}".format(node_test.next))

    if ls.tail != node_test:
        raise ValueError("Вставка в конце. ls.tail != node_test: {}".format(ls.tail.value))

    print("Insert: success")