def merge(a, b): ''' Merges two linked list sorting data in the nodes Returns a list_merged linked list ''' list_merged = SinglyLinkedList() list_merged.prepend(Node( 0)) # Add a fake head that is discarted later to avoid empty lists current = list_merged.head a_head = a.head b_head = b.head # Iterate over each node until we reach the tail one and build the list by updating the current next node while a_head != None or b_head != None: if a_head is None: current.next = b_head b_head = b_head.next elif b_head is None: current.next = a_head a_head = a_head.next else: if a_head.data < b_head.data: current.next = a_head a_head = a_head.next else: current.next = b_head b_head = b_head.next current = current.next # Discard fake head and set first list_merged node as head list_merged.head = list_merged.head.next return list_merged
class SetupSinglyLinkedList: def setup_method(self): self.test_list = SinglyLinkedList() self.test_list.append(42) self.test_list.append(33) self.test_list.append('spam') self.test_list.prepend([]) self.test_list.prepend({'a': 42})
def palindromic(l): r = SinglyLinkedList() current = l.head while current is not None: r.prepend(SinglyLinkedNode(current.value)) current = current.child l_iter = l.head r_iter = r.head while l_iter is not None: if l_iter.value != r_iter.value: return False l_iter = l_iter.child r_iter = r_iter.child return True
def palindromic(l): r = SinglyLinkedList() current = l.head while current is not None: r.prepend(SinglyLinkedNode(current.value)) current = current.child l_iter = l.head r_iter = r.head while l_iter is not None: if l_iter.value != r_iter.value: return False l_iter = l_iter.child r_iter = r_iter.child return True
def create_list(self, length_neck, length_loop): neck = SinglyLinkedList() for i in range(length_neck): neck.prepend(SinglyLinkedNode(length_neck - i)) loop = SinglyLinkedList() for i in range(length_loop): loop.prepend(SinglyLinkedNode(length_neck + length_loop - i)) if loop.head is not None: end = loop.head while end.child is not None: end = end.child end.child = loop.head neck.append(loop.head) return neck
def create_list(self, length_neck, length_loop): neck = SinglyLinkedList() for i in range(length_neck): neck.prepend(SinglyLinkedNode(length_neck - i)) loop = SinglyLinkedList() for i in range(length_loop): loop.prepend(SinglyLinkedNode(length_neck + length_loop - i)) if loop.head is not None: end = loop.head while end.child is not None: end = end.child end.child = loop.head neck.append(loop.head) return neck
def test_linked_list_single_item(): """test_linked_list_single_item.""" ll = SinglyLinkedList() ll.prepend(5) assert ll.head.item is 5 print("One item, ", ll) for node in ll: assert node.item is 5 assert 5 in ll assert not any(value in ll for value in range(-100, 100) if value is not 5) assert len(ll) is 1 assert ll.remove(5) is 5 assert 5 not in ll assert len(ll) is 0 for _ in ll: raise AssertionError("Collection should be empty, iterator returned.") print("Passed all tests for single item in linked list")
def time_prepend(): n = 50000 print('time_prepend, n =', n) with timewith(' linked list '): container = SLL() for x in range(n): container.prepend(x) del container with timewith(' list '): container = list() for x in range(n): container.insert(0, x) del container with timewith(' deque '): container = deque() for x in range(n): container.appendleft(x) del container
def test_linked_list_many_items(): """test_linked_list_many_items.""" ll = SinglyLinkedList() numbers = [value for value in range(-100, 100)] for number in numbers: ll.prepend(number) print("Many items, ", ll) assert len(ll) == len(numbers) assert [node.item for node in ll] == numbers[-1::-1] assert all(number in ll for number in numbers) assert not any( number in ll for number in chain(range(-200, -100), range(100, 200))) assert ll.remove(500) is None assert all(ll.remove(value) is not None for value in numbers) assert not any(number in ll for number in numbers) assert len(ll) is 0 for _ in ll: raise AssertionError("Collection should be empty, iterator returned.") print("Passed all tests for single item in linked list")
def build_list_from_string(self, s): l = SinglyLinkedList() for c in s[::-1]: l.prepend(SinglyLinkedNode(c)) return l
def build_list_from_string(self, s): l = SinglyLinkedList() for c in s[::-1]: l.prepend(SinglyLinkedNode(c)) return l
def build_list(self, values): l = SinglyLinkedList() for value in values[::-1]: l.prepend(SinglyLinkedNode(value)) return l
def test_prepend_adds_an_element_at_the_beginning_even_without_a_first_node( self): linked = SinglyLinkedList() linked.prepend(1000) self.assertEqual(linked.as_list(), [1000])
def test_prepend_adds_an_element_at_the_beginning(self): linked = SinglyLinkedList(100) linked.prepend(1000) self.assertEqual(linked.as_list(), [1000, 100])
elif b_head is None: current.next = a_head a_head = a_head.next else: if a_head.data < b_head.data: current.next = a_head a_head = a_head.next else: current.next = b_head b_head = b_head.next current = current.next # Discard fake head and set first list_merged node as head list_merged.head = list_merged.head.next return list_merged N1 = Node(10) N2 = Node(20) N3 = Node(30) N4 = Node(40) N5 = Node(50) list = SinglyLinkedList(N1) list.prepend(N2) list.prepend(N3) list.prepend(N4) list.prepend(N5) print('Original', list) print('Sorted', merge_sort(list))
def build_list(self, values): l = SinglyLinkedList() for value in values[::-1]: l.prepend(SinglyLinkedNode(value)) return l
def list_rep(self, a_string): a = SinglyLinkedList() for digit in a_string: a.prepend(SinglyLinkedNode(int(digit))) return a
def list_rep(self, a_string): a = SinglyLinkedList() for digit in a_string: a.prepend(SinglyLinkedNode(int(digit))) return a