Files
leetcode/0025-reverse-nodes-in-k-group/0025-reverse-nodes-in-k-group.py
T

68 lines
1.7 KiB
Python

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
if k == 1:
return head
dummyHead = ListNode(-1, head)
beforeSeg = dummyHead
firstInSeg = head
lastInSeg = None
afterSeg = None
# Get initial values for lastInSeg and afterSeg
curr = head
for i in range(k):
if i == k - 1:
lastInSeg = curr
afterSeg = curr.next
elif curr is None:
return head
curr = curr.next
# hold one before segment
# hold last in segment
# hold one after segment
while lastInSeg is not None:
# in segment, flip all links
prev = None
curr = beforeSeg.next
next = beforeSeg.next.next
for i in range(k):
newPrev = curr
newCurr = next
newNext = next.next if next is not None else None
curr.next = prev
prev, curr, next = newPrev, newCurr, newNext
beforeSeg.next = lastInSeg
firstInSeg.next = afterSeg
beforeSeg = firstInSeg
firstInSeg = afterSeg
curr = firstInSeg
lastInSeg = None
afterSeg = None
for i in range(k):
if curr is None:
break
elif i == k - 1:
lastInSeg = curr
afterSeg = curr.next
curr = curr.next
return dummyHead.next