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})
示例#3
0
文件: 2_6.py 项目: nkashy1/intprep
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
示例#4
0
文件: 2_6.py 项目: zomglings/intprep
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
示例#5
0
文件: 2_8.py 项目: nkashy1/intprep
    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
示例#6
0
文件: 2_8.py 项目: zomglings/intprep
    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
示例#7
0
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")
示例#8
0
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
示例#9
0
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")
示例#10
0
文件: 2_6.py 项目: zomglings/intprep
 def build_list_from_string(self, s):
     l = SinglyLinkedList()
     for c in s[::-1]:
         l.prepend(SinglyLinkedNode(c))
     return l
示例#11
0
文件: 2_6.py 项目: nkashy1/intprep
 def build_list_from_string(self, s):
     l = SinglyLinkedList()
     for c in s[::-1]:
         l.prepend(SinglyLinkedNode(c))
     return l
示例#12
0
文件: 2_7.py 项目: nkashy1/intprep
 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))
示例#16
0
文件: 2_7.py 项目: zomglings/intprep
 def build_list(self, values):
     l = SinglyLinkedList()
     for value in values[::-1]:
         l.prepend(SinglyLinkedNode(value))
     return l
示例#17
0
文件: 2_5.py 项目: nkashy1/intprep
 def list_rep(self, a_string):
     a = SinglyLinkedList()
     for digit in a_string:
         a.prepend(SinglyLinkedNode(int(digit)))
     return a
示例#18
0
文件: 2_5.py 项目: zomglings/intprep
 def list_rep(self, a_string):
     a = SinglyLinkedList()
     for digit in a_string:
         a.prepend(SinglyLinkedNode(int(digit)))
     return a