ReverseNodeInKGroup
ID: 25
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.
Input: head = [1,2,3,4,5], k = 2
Output: [2,1,4,3,5]
Idea
Check if k is greater than number of node in list, if not, return original list
If greater than length of list, curr is now at the last element of the first group, so keep track of the first element in next group.
Apply resversekgroup for next group, reverse curr group, use curr group head to connect next group reversed head etc.
Code
public ListNode reverseKGroup(ListNode l, int k) {
if(l==null || l.next==null){
return l;
}
ListNode curr = l;
int len = 1;
while(curr.next!=null && len<k){
curr = curr.next;
len++;
}
if(len<k){
return l;
}
ListNode tempNode = curr.next;
curr.next = null;
ListNode tempList = reverseKGroup(tempNode, k);
ListNode prev = reverse(l);
l.next = tempList;
return prev;
}
ListNode reverse(ListNode l){
if(l==null){
return l;
}
ListNode next = null;
ListNode prev = null;
ListNode curr = l;
while(curr!=null){
next = curr.next;
curr.next= prev;
prev = curr;
curr = next;
}
return prev;
}
Last updated