import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
public ListNode reverseKGroup (ListNode head, int k) {
if (head == null){
return null;
}
//求链表长度
ListNode temp = head;
int len = 0;
while (temp != null){
len++;
temp = temp.next;
}
if (k == 1){
return head;
}
//solve
ListNode newHead = null;
ListNode pre = null;
ListNode cur = head;
ListNode tmp = head;
ListNode tailTrack = head;
for (int i = 0; i < len; i += k){
int count = 0;
while (count < k){
if (cur != null){
count++;
pre = cur;
cur = cur.next;
}
else{
break;
}
}
if (count == k){
//将链断干净,保证反转的这个链表链表结尾是null,否则会将整条链表都给直接反转
pre.next = null;
if (i == 0){
newHead = reverse(tailTrack);
}
else{
reverse(tailTrack);
}
}
//剩余的链表末尾段长度不够k个不翻转,直接连接即可,此时已经获得了完整的符合题意的链表结构,直接退出循环
if (count < k){
tmp.next = tailTrack;
break;
}
//第一轮tmp不动,先让tailTrack动,然后再进行操作,起到保存的作用
if (i != 0){
tmp.next = pre;
tmp = tailTrack;
}
tailTrack = cur;
}
return newHead;
}
//反转链表
public ListNode reverse(ListNode head){
ListNode pre = null;
ListNode cur = head;
ListNode next = cur.next;
while (next != null){
cur.next = pre;
pre = cur;
cur = next;
next = cur.next;
}
cur.next = pre;
return cur;
}
}