def reverse_k(L, k): dummy_head = ListNode(0, L) sublist_predecessor = dummy_head sublist_head = dummy_head.next sublist_successor = dummy_head sublist_tail = dummy_head.next while sublist_head: # Identify the tail of sublist of k nodes to be reversed. num_remaining = k while num_remaining: sublist_successor = sublist_tail sublist_tail = sublist_tail.next num_remaining -= 1 if not sublist_tail: break if num_remaining > 0: # Specification says not to reverse. return dummy_head.next sublist_successor.next = None reverse_linked_list(sublist_head) # Splice the reversed sublist. sublist_predecessor.next = sublist_successor # Go on to the head of next sublist. sublist_predecessor = sublist_head sublist_head.next = sublist_tail sublist_head = sublist_tail sublist_successor = None return dummy_head.next
def is_linked_list_a_palindrome(L): slow = fast = L while fast and fast.next: fast, slow = fast.next.next, slow.next first_half_iter, second_half_iter = L, reverse_linked_list(slow) while second_half_iter and first_half_iter: if second_half_iter.data != first_half_iter.data: return False second_half_iter, first_half_iter = (second_half_iter.next, first_half_iter.next) return True
def is_linked_list_a_palindrome(L): # Finds the second half of L. slow = fast = L while fast and fast.next: fast, slow = fast.next.next, slow.next # Compares the first half and the reversed second half lists. first_half_iter, second_half_iter = L, reverse_linked_list(slow) while second_half_iter and first_half_iter: if second_half_iter.data != first_half_iter.data: return False second_half_iter, first_half_iter = (second_half_iter.next, first_half_iter.next) return True
def is_linked_list_a_palindrome(L): # Finds the second half of L. slow = fast = L while fast and fast.next: fast, slow = fast.next.next, slow.next # Compares the first half and the reversed second half lists. first_half_iter, second_half_iter = L, reverse_linked_list(slow) while second_half_iter and first_half_iter: if second_half_iter.data != first_half_iter.data: return False second_half_iter, first_half_iter = (second_half_iter.next, first_half_iter.next) return True
def zipping_linked_list(L): if not L or not L.next: return L # Finds the second half of L. slow = fast = L while fast and fast.next: slow, fast = slow.next, fast.next.next first_half_head = L second_half_head = slow.next slow.next = None # Splits the list into two lists. second_half_head = reverse_linked_list(second_half_head) # Interleave the first half and the reversed of the second half. first_half_iter, second_half_iter = first_half_head, second_half_head while second_half_iter: second_half_iter.next, first_half_iter.next, second_half_iter = ( first_half_iter.next, second_half_iter, second_half_iter.next) first_half_iter = first_half_iter.next.next return first_half_head
def zipping_linked_list(L): if not L or not L.next: return L # Finds the second half of L. slow = fast = L while fast and fast.next: slow, fast = slow.next, fast.next.next first_half_head = L second_half_head = slow.next slow.next = None # Splits the list into two lists. second_half_head = reverse_linked_list(second_half_head) # Interleave the first half and the reversed of the second half. first_half_iter, second_half_iter = first_half_head, second_half_head while second_half_iter: second_half_iter.next, first_half_iter.next, second_half_iter = ( first_half_iter.next, second_half_iter, second_half_iter.next) first_half_iter = first_half_iter.next.next return first_half_head