public static ListNode reverseKGroup(ListNode head,int k){
//start是每一组起始的位置;
ListNode start = head;
//end是每一组终止的位置;
ListNode end = getKGroupEnd(start, k);
if(end ==null){
return head;
}
//满足一组;
head = end;
reverse(start,end);//链表结构发生了改变;
//start成为上一组的结尾点;
// 记录上一组的结尾节点
ListNode lastEnd = start;
//下面还有结点的时候 才会进行下去;
while(start.next!=null){
start = start.next;
end = getKGroupEnd(start, k);
//end==null 表明下面不足k个节点;
if(end ==null){
return head;
}
reverse(start,end);//链表结构发生了改变;
lastEnd.next = end;
}
return head;
}
/**
* @param start 开始的节点
* @param k k个节点之后
* @return k个节点之后是什么节点
*/
public static ListNode getKGroupEnd(ListNode start, int k){
while(--k>0 && start!=null){
start = start.next;
}
return start;
}
/**
* 实现一段链表的一个反转;
*在这个过程中 start end
* @param begin 起始节点
* @param end 终止节点
*/
public static void reverse(ListNode begin, ListNode end) {
end = end.next;
ListNode pre = null;
ListNode cur = begin;
ListNode next = null;
while (cur != end) {
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
//经历while循环 begin->end完成reverse;
begin.next = end;
}