mirror of
https://github.com/devenperez/leetcode.git
synced 2026-06-15 09:57:09 +00:00
68 lines
1.7 KiB
Python
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 |