Esempio n. 1
0
 def testAppend(self):
     dl = ll.DoublyLinkedList()
     a, b, c, d = ll.Node('a'), ll.Node('b'), ll.Node('c'), ll.Node('d')
     dl.append_list([a, b, c, d])
     self.assertEqual(dl.values(), ['a', 'b', 'c', 'd'])
     self.assertEqual(dl.head, a)
     self.assertEqual(dl.tail, d)
Esempio n. 2
0
def create_linked_list_from_number(number):
    """
    Function to create a linked list out of given number.

    Parameters
    ----------
    number: ``int``
        Number of which linked list will be created.


    Returns
    -------
    Head of type ``node`` of resultant linked list.

    Time Complexity
    ---------------
    O(D), where D is the number of digits in the number.
    Space Complexity
    ----------------
    O(D)
    """
    head = None

    while number != 0:
        if not head:
            head = ll.Node(number % 10)
            pointer = head
        else:
            pointer.next = ll.Node(number % 10)
            pointer = pointer.next
        number = number // 10
    return head
Esempio n. 3
0
 def test_remove_node(self):
     my_list = linked_list.List(linked_list.Node(5))
     node = linked_list.Node(7)
     my_list.append(node)
     my_list.append(linked_list.Node(9))
     my_list.remove(node)
     self.assertEqual(my_list.get_head().get_data(), 5)
     self.assertEqual(my_list.get_head().get_next().get_data(), 9)
     self.assertEqual(my_list.get_tail().get_data(), 9)
Esempio n. 4
0
 def testPop(self):
     n1, n2, n3 = ll.Node(1), ll.Node(2), ll.Node(3)
     llist = ll.LinkedList(n1)
     llist.insert_at_tail(n2)
     llist.insert_at_tail(n3)
     res = llist.pop()
     self.assertEqual(res.value, n1.value)
     self.assertEqual(res.next, None)
     self.assertEqual(n2.next, n3)
Esempio n. 5
0
    def add_edge(self, v, w):
        if self.vertices[v] is None:
            self.vertices[v] = linked_list.Node(w)
        else:
            self.vertices[v] = self.vertices[v].insert(w)

        if self.vertices[w] is None:
            self.vertices[w] = linked_list.Node(v)
        else:
            self.vertices[w] = self.vertices[w].insert(v)
Esempio n. 6
0
 def testInsertAfter(self):
     llist = self.exampleList()
     found_node = llist.search(5)
     llist.insert_after(found_node, ll.Node(10))
     self.assertEqual(llist.to_list(), [0, 2, 5, 10, 7])
     self.assertEqual(llist.tail.value, 7)
     # Test insertion after tail
     found_node = llist.search(7)
     llist.insert_after(found_node, ll.Node(12))
     self.assertEqual(llist.to_list(), [0, 2, 5, 10, 7, 12])
     self.assertEqual(llist.tail.value, 12)
Esempio n. 7
0
def partition_linked_list(head, x):
    """
    Function to partition a linked list around a given value.

    Parameters
    ----------
    head: ``Node``
        Head node of linked list.

    x: ``int``
        Integer value around which linked list needs to be partitioned.

    Returns
    -------
    Head node of type ``Node`` of partitioned linked list.

    Time Complexity
    ---------------
    O(N)
    Space Complexity
    ----------------
    O(N)
    """

    # Create null head nodes for paritioned linked lists.
    smaller_x_head = None
    remaining_head = None

    # Traverse original linked list
    while head:
        print(head.value)
        # If current node's value is smallers than x, then create a node with
        # this value and attach it to the smaller_x linked list.
        if head.value < x:
            if smaller_x_head:
                smaller_x_pointer.next = ll.Node(head.value)
                smaller_x_pointer = smaller_x_pointer.next

            else:
                smaller_x_head = ll.Node(head.value)
                smaller_x_pointer = smaller_x_head
        # Otherwise, attach it to the remaining linked list
        else:
            if remaining_head:
                remaining_x_pointer.next = ll.Node(head.value)
                remaining_x_pointer = remaining_x_pointer.next
            else:
                remaining_head = ll.Node(head.value)
                remaining_x_pointer = remaining_head
        head = head.next

    # Connect the 2 linked lists together
    smaller_x_pointer.next = remaining_head
    return smaller_x_head
Esempio n. 8
0
 def testInsertAtHead(self):
     dl = ll.DoublyLinkedList()
     a, b, c, d = ll.Node('a'), ll.Node('b'), ll.Node('c'), ll.Node('d')
     e = ll.Node('e')
     dl.insert_at_head(a)
     self.assertEqual(dl.head, a)
     self.assertEqual(dl.tail, a)
     dl.append_list([b, c, d])
     self.assertEqual(dl.values(), ['a', 'b', 'c', 'd'])
     dl.insert_at_head(e)
     self.assertEqual(dl.values(), ['e', 'a', 'b', 'c', 'd'])
Esempio n. 9
0
 def testInsertAtTail(self):
     # Empty list
     llist = ll.LinkedList()
     llist.insert_at_tail(ll.Node(10))
     self.assertEqual(llist.to_list(), [10])
     self.assertEqual(llist.head.value, 10)
     self.assertEqual(llist.tail.value, 10)
     # Normal list
     llist = self.exampleList()
     llist.insert_at_tail(ll.Node(10))
     self.assertEqual(llist.to_list(), [0, 2, 5, 7, 10])
     self.assertEqual(llist.tail.value, 10)
Esempio n. 10
0
 def testInsertAtHead(self):
     llist = self.exampleList()
     llist.insert_at_head(ll.Node(10))
     self.assertEqual(llist.to_list(), [10, 0, 2, 5, 7])
     self.assertEqual(llist.head.value, 10)
     self.assertEqual(llist.tail.value, 7)
     # Test insertion in empty list
     llist = ll.LinkedList()
     llist.insert_at_head(ll.Node(10))
     self.assertEqual(llist.to_list(), [10])
     self.assertEqual(llist.head.value, 10)
     self.assertEqual(llist.tail.value, 10)
Esempio n. 11
0
 def testDelete(self):
     dl = ll.DoublyLinkedList()
     a, b, c, d = ll.Node('a'), ll.Node('b'), ll.Node('c'), ll.Node('d')
     dl.append_list([a, b, c, d])
     self.assertEqual(dl.values(), ['a', 'b', 'c', 'd'])
     dl.delete(b)
     self.assertEqual(dl.values(), ['a', 'c', 'd'])
     dl.delete(a)
     self.assertEqual(dl.values(), ['c', 'd'])
     self.assertEqual(dl.head, c)
     dl.delete(d)
     self.assertEqual(dl.values(), ['c'])
     self.assertEqual(dl.head, c)
     self.assertEqual(dl.tail, c)
Esempio n. 12
0
def add_ints(head1, head2):
    output = linked_list.Node(None)
    new_head = output
    carry = 0
    while head1 != None or head2 != None or carry > 0:
        h1_val = (head1.value if head1 else 0)
        h2_val = (head2.value if head2 else 0)
        node_sum = (h1_val + h2_val + carry) % 10
        carry = int((h1_val + h2_val + carry) / 10)
        output.next = linked_list.Node(node_sum)
        output = output.next
        head1 = (None if head1 == None else head1.next)
        head2 = (None if head2 == None else head2.next)

    return new_head.next
Esempio n. 13
0
def partition(head, x):
    first = head.value
    second = head.next.value
    if first > second:
        first, second = second, first
    high = linked_list.Node(second, None)
    low = linked_list.Node(first, high)
    head = head.next.next
    while head:
        if head.value >= x:
            high.next = linked_list.Node(head.value, None)
            high = high.next
        else:
            low = linked_list.Node(head.value, low)
        head = head.next
    return low
Esempio n. 14
0
def test_delete():
    test_ll = linked_list.create_ll(10)
    temp = test_ll.next
    test_ll.next = linked_list.Node(100, temp)
    linked_list.print_ll(test_ll)
    print("deleted ll")
    new_head = delete_node(test_ll, 100)
    linked_list.print_ll(test_ll)
Esempio n. 15
0
    def _run_test(data, correct):
        l = linked_list.List()

        for item in data:
            node = linked_list.Node(item)
            l.add_last(node)

        assert is_palindrom(l) == correct
 def add_adjecency(self, vertex):
     adge = self.adjacency_list.head
     while (adge):
         if adge.cargo == vertex:
             raise ValueError("adge already exists for:" + vertex.name)
         adge = adge.next
     self.adjacency_list.add(ll.Node(vertex))
     vertex.in_degree += 1
Esempio n. 17
0
 def enqueue(self, data):
     node = linked_list.Node(data)
     if self.isEmpty():
         self.queue.add_node_by_obj(node)
         self.last = node
         self.first = node
         return
     self.last.next = node
     self.last = node
Esempio n. 18
0
def object_priority_queue_test():
    queue = ObjectPriorityQueue()

    a = [4,8,9,2,4,88,23,22]
    for i in a:
        queue.enqueue(linked_list.Node(i))
    
    for i in range(len(a) -1 ):
        print(traverse_heap(queue.heap.heap))
        print(queue.dequeue().data)

#object_priority_queue_test()
Esempio n. 19
0
def test_heap():
    h = MinObjectHeap()
    #h.heap
    a = [5, 7, 9, 1, 3, 4, 50, -1]
    for i in a:
        x = linked_list.Node(i)
        h.push(x)
    print(h.heap)
    traverse_heap(h.heap)
    h.pop()
    traverse_heap(h.heap)
    h.pop()
    traverse_heap(h.heap)
def add(head1, head2):

    if not head1 or not head2:
        return "Linked List are empty"

    curr = None
    carry = 0

    while (head1 or head2):
        total_sum = 0

        if head1:
            total_sum += head1.data

        if head2:
            total_sum += head2.data

        sum = carry + (total_sum % 10)
        carry = total_sum / 10

        temp = linked_list.Node(sum)

        if curr:
            curr.nextnode = temp
            curr = curr.nextnode
        else:
            ll = linked_list.LinkedList(temp)
            curr = ll.head

        if head1:
            head1 = head1.nextnode
        if head2:
            head2 = head2.nextnode

    if carry:
        curr.nextnode = linked_list.Node(carry)

    return ll
Esempio n. 21
0
def sum_lists(l1, l2, carry=0):
    if l1 is None and l2 is None:
        return None

    def expand_list(l):
        if l is None:
            return 0, None
        else:
            return l.value, l.next
    l1_value, l1_next = expand_list(l1)
    l2_value, l2_next = expand_list(l2)
    s = divmod(l1_value + l2_value + carry, 10)
    passed_carry = 0
    if s >= 10:
        s -= 10
        passed_carry = 1
    return linked_list.Node(s, sum_lists(l1_next, l2_next, passed_carry))
Esempio n. 22
0
 def insert(self, key, value):
     if key in self.dict:
         # Data already in LRU: don't update but move to front of line
         node = self.dict[key]
         self.dll.delete(node)
         self.dll.insert_at_head(node)
         return
     if len(self.dict) >= self.capacity:
         # Evict LRU node if at capacity
         lru_node = self.dll.tail
         self.dll.delete(lru_node)
         self.dict.pop(lru_node.data.key)
     # Insert new node at head of queue
     node = ll.Node(LRUItem(key=key, value=value))
     self.dict[key] = node
     self.dll.insert_at_head(node)
     return
    #it reaches a new node.
    while current.next:
        current = current.next
        counter += 1
    #make sure m is not larger than the counter, or number of nodes in
    #the linked list
    if m > counter:
        print "Only {} nodes. Can't find {}.".format(counter, m)
        return None
    else:
        return ll.get_position(counter - m + 1).data


#Test function
print "Test Question 5"
n1 = LL.Node(1)
n2 = LL.Node(2)
n3 = LL.Node(3)
n4 = LL.Node(4)
ll = LL.LinkedList(n1)
ll.append(n2)
ll.append(n3)
ll.append(n4)
print question5(ll, 3)
#2
print question5(ll, 1)
#4
print question5(ll, 8)
#Prints 'Only 4 nodes. Can't find 8' and returns None
print question5(ll, 2)
#3
Esempio n. 24
0
 def test_node_get_data(self):
     node = linked_list.Node(10)
     self.assertTrue(node.get_data(), 10)
Esempio n. 25
0
 def test_list_creation(self):
     my_list = linked_list.List(linked_list.Node(2))
     self.assertEqual(my_list.get_head().get_data(), 2)
     self.assertEqual(my_list.get_tail().get_data(), 2)
def test_init_node():
    with pytest.raises(ValueError):
        linked_list.Node("f", 4)
Esempio n. 27
0
import linked_list
import random
import cmath

if __name__ == '__main__':
    data1 = [1, 2, 3]

#create a linked list and assigning data to nodes
    llist = linked_list.LinkedList()
    llist.head = linked_list.Node(data1)
    second = linked_list.Node([2, 4, 5])
    third = linked_list.Node([3, 5, 7])

#Linking the nnodes
    llist.head.next = second
    second.next = third

    print("Original linked list:")
    llist.printList()
    

    data1.append(4)
    print("Original linked list after appending an element to a node:")
    llist.printList()

    llist.append([6,7,8])
    print("After appending :")
    llist.printList()

    print("After inserting :")
    llist.insertAfter(llist.head.next, [11,12,13]) 
def test_str_node():
    assert str(linked_list.Node(3)) == "(3)"
Esempio n. 29
0
 def testInit(self):
     a = ll.Node('a')
     d = ll.DoublyLinkedList(a)
     self.assertEqual(d.values(), ['a'])
     self.assertEqual(d.head, a)
     self.assertEqual(d.tail, a)
Esempio n. 30
0
 def test_remove_head(self):
     my_list = linked_list.List(linked_list.Node(5))
     node = linked_list.Node(7)
     my_list.append(node)
     my_list.remove(linked_list.Node(5))
     self.assertEqual(my_list.get_head().get_data(), 7)