Given a linked list, reverse the nodes of a linked list k at a time and return its 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.
Example
Consideration
- We should use count to count every k nodes
- We should remember the pre node right before the k nodes and the next node right after the k node.
- Then, we use last node to remember the last node after reverse and use a cur node to iterate the k-node from the 2nd one.
Solution 1
Time Complexity: O(n), where n is the length of the list. The while loop iterates n times to find all nodes lists whose length is k. And for the k node list, we iterate k times to reverse it. Totally, O(n+k*(n/k)) = O(2n).
Space Complexity: O(1).
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || k == 1)
return head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
ListNode cur = head;
int count = 0;
while(cur != null) {
count++;
//Here we should rememeber the next node, since the reverse function will modify the list node
ListNode next = cur.next;
if(count % k == 0) {
pre = reverse(pre, next);
}
cur = next;
}
return dummy.next;
}
private ListNode reverse(ListNode pre, ListNode next) {
ListNode last = pre.next;
ListNode cur = last.next;
while(cur != next) {
last.next = cur.next;
cur.next = pre.next;
pre.next = cur;
cur = last.next;
}
return last;
}
}