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)
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)
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)
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)
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)
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])
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)
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)
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)
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
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)
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)
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')
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)
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)
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)
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)
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)
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')
def create_list(node_names): linked_list = LinkedList() for i in node_names.values(): linked_list.add_in_tail(Node(i)) return linked_list
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")