from _linked_list import Node, get_linked_list


def count_no_of_elements(head):
    count = 0
    while head:
        count += 1
        head = head.next

    return count


if __name__ == "__main__":
    head = get_linked_list(6)
    print "Count # of nodes: {0}".format(count_no_of_elements(head))
    while(head):
        #print "head: {0}, mid:{1}".format(head, mid_ptr)
        # increment mid only for odd count value.
        # concept same as fast_pointer.
        if (count & 1):
            mid_ptr = mid_ptr.next
        count += 1
        head = head.next
    return mid_ptr



if __name__ == '__main__':
    #odd naive
    print "odd: middle element {0}".format(naive_middle_element_in_linked_list(get_linked_list(5)))
    # even naive
    print "even: middle element {0}".format(naive_middle_element_in_linked_list(get_linked_list(6)))
    #empty naive
    print "empty: middle element {0}".format(naive_middle_element_in_linked_list(None))

    #odd
    print "odd: middle element {0}".format(middle_element_of_linked_list(get_linked_list(5)))
    # even
    print "even: middle element {0}".format(middle_element_of_linked_list(get_linked_list(6)))
    # empty
    print "empty: middle element {0}".format(middle_element_of_linked_list(None))

    #odd
    print "odd: middle element {0}".format(middle_element_with_head_and_one_fast_pointer(get_linked_list(5)))
    # even