/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
//特殊值处理,空链表,或者链表的长度为1,或者是链表反转区间长度为1
if(head == null || head.next == null || k==1){
return head;
}
ListNode head0 = head;//临时头指针
int size = 0; //链表的长度
while (head0!=null){//遍历链表,统计链表的长度
head0 = head0.next;
size++;
}
head0 = head;//临时头指针重新指向头指针
int count = size/k;//反转区间的个数
if(count<1){//如果反转区间的个数为0,即不用反转
return head;
}
ListNode tail = null; //当前反转区间的尾节点
ListNode prep = null; //当前节点的前驱节点
for(int i=0;i<count;i++){
ListNode next = head0.next; //当前节点的后继节点
ListNode head0Temp = head0; //反转区间的开始节点
int len = k;
while (len>0){//null->1->2
next = head0.next; //当前节点的后继节点
head0.next = prep; //链表反转
prep = head0; //前驱节点后移
head0 = next; //当前节点后移
len--; //反转区间减一
}
if(i==0){//如果是第一个反转区间,则prep为反转后的头指针
head = prep;
}else{
tail.next = prep; //前一反转区间的尾指针指向当前反转区间的头指针
}
tail = head0Temp; //更新当前反转区间的尾节点
prep = tail; //更新反转区间的前驱节点
prep.next = head0;//当前反转区间的尾节点指向下一个反转区间的头节点
}
// if(size%k != 0){//剩下的节点不足以分成一组,前一反转区间的尾指针指向剩下的头节点节点
// tail.next = head0;
// }
return head;
}
}