def middle_node(self, head): # write your code here if not head: return None dummy = ListNode(-1) dummy.next = head slow, fast = dummy, dummy while fast and fast.next: slow = slow.next fast = fast.next.next return slow
def reverseBetween(self, head, m, n): dummy = ListNode(-1, head) mth_prev = self.findkth(dummy, m - 1) mth = mth_prev.next nth = self.findkth(dummy, n) nth_next = nth.next nth.next = None self.reverse(mth) mth_prev.next = nth mth.next = nth_next return dummy.next
def reorderList(self, head): if head is None: return head #find mid slow = head fast = head while fast.next and fast.next.next: slow = slow.next fast = fast.next.next mid = slow #cut in the mid left = head right = mid.next if right is None: return head mid.next = None #reverse right half cursor = right.next right.next = None while cursor: next = cursor.next cursor.next = right right = cursor cursor = next #merge left and right dummy = ListNode(0) while left or right: if left is not None: dummy.next = left left = left.next dummy = dummy.next if right is not None: dummy.next = right right = right.next dummy = dummy.next return head
def reverseBetween(self, head, m, n): diff, dummy, cur = n - m + 1, ListNode(-1), head dummy.next = head last_unswapped = dummy while cur and m > 1: cur, last_unswapped, m = cur.__next__, cur, m - 1 prev, first_swapped = last_unswapped, cur while cur and diff > 0: cur.next, prev, cur, diff = prev, cur, cur.next, diff - 1 last_unswapped.next, first_swapped.next = prev, cur return dummy.__next__
def reorderList(self, head): if head == None or head.next == None: return head fast, slow, prev = head, head, None while fast != None and fast.next != None: fast, slow, prev = fast.next.next, slow.next, slow current, prev.next, prev = slow, None, None while current != None: current.next, prev, current = prev, current, current.next l1, l2 = head, prev dummy = ListNode(0) current = dummy while l1 != None and l2 != None: current.next, current, l1 = l1, l1, l1.next current.next, current, l2 = l2, l2, l2.next return dummy.next
def reverseBetween(self, head, m, n): dummyNode = ListNode(0) p = dummyNode q = head for x in range(m - 1): p.next = q q = q.next p = p.next start = None end = q next = None for x in range(m, n + 1): next = q.next q.next = start start = q q = next p.next = start end.next = next return dummyNode.next
def __init__(self): self.dummy = self.tail = ListNode(-1)
def push(self, x): node = ListNode(x) node.pre = self.tail self.tail.nxt = node self.tail = node