import java.util.*;
/*
* 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
if(head == null || head.next == null){
return head;
}
//第一步 分割链表
ArrayList<ListNode> list = new ArrayList<>();
while(head != null){
ListNode node = head;
boolean isHaveKSize = true;
for(int i = 0;i< k - 1;i++){
if(node.next != null){
node = node.next;
} else {
//不够k个
isHaveKSize = false;
break;
}
}
if (isHaveKSize){
ListNode next = node.next;
node.next = null;
list.add(head);
head = next;
} else {
break;
}
}
//第二步 分别翻转
for(int i = 0;i<list.size();i++){
ListNode reverseNode = reverse(list.remove(i));
list.add(i,reverseNode);
}
//第三步 拼接
if(list.size() > 0){
ListNode first = list.get(0);
ListNode tail = findTail(first);
for(int i = 1;i<list.size();i++){
ListNode node = list.get(i);
tail.next = node;
tail = findTail(node);
}
//不是k的倍数 保持原样
if(head != null){
tail.next = head;
}
return first;
} else {
return head;
}
}
public static ListNode findTail(ListNode node){
if(node == null || node.next == null){
return node;
}
ListNode tail = node;
while(tail.next != null){
tail = tail.next;
}
return tail;
}
public static ListNode reverse(ListNode head){
if(head == null || head.next == null){
return head;
}
ListNode last = null;
while(head != null){
ListNode next = head.next;
head.next = last;
last = head;
head = next;
}
return last;
}
}