Description
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 <= 50000 <= Node.val <= 1000
Follow-up: Can you solve the problem in O(1) extra memory space?
Approach
- Create a simple method to fetch the kth element from the head provided and create a dummy
- Loop with exit condition as the kth method is null
- Perform a simple reversal but keep in mind the value of previous and current just think of first iteration and what their values should be
- Lastly we have to maintain the previous group tail now and link kth element with the older one
Time:O(n) Space:O(1)- Simply iterating the linked list
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode getkth(ListNode list, int k) {
while (list != null && k > 0) {
list = list.next;
k--;
}
return list;
}
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0, head);
ListNode prevGroup = dummy;
while (true) {
ListNode kth = getkth(prevGroup, k);
if (kth == null)
break;
ListNode nextGroup = kth.next;
ListNode prev = kth.next;
ListNode curr = prevGroup.next;
while (curr != nextGroup) {
ListNode tmp = curr.next;
curr.next = prev;
prev = curr;
curr = tmp;
}
ListNode tmp = prevGroup.next;
prevGroup.next = kth;
prevGroup = tmp;
}
return dummy.next;
}
}