0%

Reverse Nodes in k-Group

Question

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:

Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
@param: Head of ListNode, Integer k, reverse linkedlist every k node;
@return: Head of reversed LinkedList;
Algorithm: dummy node -> head;
before reverse, check if there is enough nodes to be reversed;
every reverse return prehead of the linkedList;
*/
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null || head.next == null) return head;

ListNode dummy = new ListNode(0);
dummy.next = head; head = dummy;

//reverse every group
while (head != null) {
head = reverseKNodes(head,k);
}
return dummy.next;
}

// return the prehead of linkedList
public ListNode reverseKNodes(ListNode head, int k) {
ListNode nk = head;
//check if there is enough nodes
for (int i = 0; i < k; i++) {
nk = nk.next;
if (nk == null) return null;
}

// head -> n1 -> n2 -> n3 -> nk -> nk+1..-> null
// head(pre) -> cur
// head -> nk -> nk-1 ->... -> n1 -> nk+1 -> null

// pre -> n1 -> n2 -> n3;
// pre cur temp
// null <- pre <- cur -> n3;
ListNode n1 = head.next;
ListNode pre = null;
ListNode cur = n1;
for (int i = 0; i < k; i++) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
n1.next = cur;
head.next = pre;
return n1;
}