def intersection_of_two_linked_list(node1, node2): if not node1 or not node2: print "Empty linked list" return None len1 = count_no_of_elements(node1) len2 = count_no_of_elements(node2) print "len1 :", len1 print "len2 :", len2 # move the pointers diff = abs(len1 - len2) if (len1>len2): i = 0 while (i<diff): node1 = node1.next i += 1 else: i = 0 while (i<diff): node2 = node2.next i += 1 while (node1 != None and node2 != None): print "node1: {0}, node2:{1}".format(node1.contents, node2.contents) if node1.contents == node2.contents: return node1 node1 = node1.next node2 = node2.next return None
def check_length_and_alter(number1, number2): #check for size length1 = count_no_of_elements(number1) length2 = count_no_of_elements(number2) if length1 != length2: diff = abs(length1-length2) if length1> length2: #number2 = insert_in_front(number2, diff) for i in range(diff): number2 = linked_list_insert(number2, 0) else: #number1 = insert_in_front(number1, diff) for i in range(diff): number1 = linked_list_insert(number1, 0) return number1, number2
def naive_middle_element_in_linked_list(head): count = count_no_of_elements(head) mid = count/2 while mid > 0 and head: head = head.next mid -= 1 return head
def method_1_reverse_linked_list_after_k(head, k): temp_head = head length = count_no_of_elements(head) if k > length: print "Wrong input: k value greater than length" return if not head: print "list is empty" return count = 0 prev_head = None while temp_head and count < k: prev_head = temp_head temp_head = temp_head.next count += 1 print "\n head.contents:{0}".format(head) print "\n prev head contents:{0}".format(prev_head) print "\noriginal list: " print_linked_list_contents(head) reversed_k_head = reverse_linked_list(temp_head) print "\n reversed_k_head list:" print_linked_list_contents(reversed_k_head) prev_head.next = reverse_linked_list print "new::"
def check_if_both_linked_list_are_same(head1, head2): if not head1 or not head2: print "Empty linked list." return False # Actually this is not needed. if count_no_of_elements(head1) != count_no_of_elements(head2): print "Number of nodes do not match!!!" return False while head1 and head2: if head1.contents != head2.contents: print "They do not look the same. Sorry" return False head1 = head1.next head2 = head2.next print "Both are the same." return True
def decimal_equivalent(head): result = 0 while head != None: result = (result << 1) + head.contents head = head.next return result if __name__ == "__main__": array1 = [0, 0, 0, 1, 1, 0, 0, 1, 0] header1 = generate_linked_list_with_values(array1) print "print_linked_list_contents: " print_linked_list_contents(header1) print "count_no_of_elements : {0}".format(count_no_of_elements(header1)) print "decimal_equivalent_based_on_length : {0}".format( decimal_equivalent_based_on_length(header1, count_no_of_elements(header1)) ) print "decimal_equivalent : {0}".format(decimal_equivalent(header1)) array2 = [1, 0, 0] header2 = generate_linked_list_with_values(array2) print "print_linked_list_contents: " print_linked_list_contents(header2) print "count_no_of_elements : {0}".format(count_no_of_elements(header2)) print "decimal_equivalent_based_on_length : {0}".format( decimal_equivalent_based_on_length(header2, count_no_of_elements(header2)) ) print "decimal_equivalent : {0}".format(decimal_equivalent(header2))