题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if (head == null){
return null;
}
//len记录链表长度
int len = 0;
//eg用于遍历链表
ListNode eg = head;
while (eg != null){
len++;
eg = eg.next;
}
if (len < k){
//如果长度小于k,返回当前链表
return head;
}
int num = len / k;
//ListNode用于标记每一组的第一个节点
ListNode headeg = head;
//eg用于记录每一组翻转后的最后一个节点
eg = head;
for (int i = 1; i <= num; i++){
//为每一组的翻转做准备工作
ListNode eg0 = headeg;
ListNode eg1 = headeg.next;
headeg.next = null;
int egi = k;
while(egi - 1!= 0){
//对每一组进行翻转
egi--;
ListNode eg2 = eg1.next;
eg1.next = headeg;
headeg = eg1;
eg1 = eg2;
}
if (i == 1){
//移动头节点,使其指向翻转后的第一个节点,只能在第一次翻转时执行一次
head = headeg;
}else{
//连接翻转后的前一组与翻转后的当前组
eg.next = headeg;
eg = eg0;
}
//连接翻转后的当前组与下一组
eg0.next = eg1;
//使headeg始终指向下一组的头节点
headeg = eg1;
}
return head;
}
主要思路是先获取链表长度,根据k值确定每一组有几个节点以及总共有几个组,然后从左往右依次操作链表中的节点。共遍历代码两次,一次用于记录链表长度,一次用于翻转链表。具体细节请看代码中的注释。

