Given the head of a linked list, reverse the nodes of the list k at a time, and return the modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes, in the end, should remain as it is.
You may not alter the values in the list's nodes, only nodes themselves may be changed.
Example 1:
Input: head = [1,2,3,4,5], k = 2
Output: [2,1,4,3,5]
Example 2:
Input: head = [1,2,3,4,5], k = 3
Output: [3,2,1,4,5]
Constraints:
The number of nodes in the list is n.
1 <= k <= n <= 5000
0 <= Node.val <= 1000
Follow-up: Can you solve the problem in O(1) extra memory space?
Solutions
Solution 1: Iteration
The time complexity is $O(n)$, and the space complexity is $O(1)$. Here, $n$ is the length of the linked list.
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */funcreverseKGroup(head*ListNode,kint)*ListNode{vardummy*ListNode=&ListNode{}p,cur:=dummy,headforcur!=nil{start:=curfori:=0;i<k;i++{ifcur==nil{p.Next=startreturndummy.Next}cur=cur.Next}p.Next,p=reverse(start,cur),start}returndummy.Next}funcreverse(start,end*ListNode)*ListNode{varpre*ListNode=nilforstart!=end{tmp:=start.Nextstart.Next,pre=pre,startstart=tmp}returnpre}