据题意,设置一个Int count=1;跟着链表遍历递增,如果count%k==0那么可以对区间内的节点进行反转。
public ListNode reverse(ListNode start){
ListNode dummy=new ListNode(-1);
while(start!=null){
ListNode next=start.next;
start.next=dummy.next;
dummy.next=start;
start=next;
}
return dummy.next;
}//翻转函数
public ListNode reverseKGroup(ListNode head, int k) {
ListNode start=head;//记录翻转区间的起点
ListNode end=head;//记录翻转区间的终点
ListNode pre=null;//记录翻转区间起点的前一个节点
int count=1;//用于计数判断当前走的长度是否是k的倍数
while(end!=null){
if(count%k==0){//执行翻转的条件
ListNode next=end.next;//备份好翻转之后的新起点
end.next=null;//先和后面断开,利于翻转函数操作
if(count==k)//如果是第一段被翻转的,那么头结点需要更新一下
head=reverse(start);
else{
pre.next=reverse(start);//区间起点的前一个节点的next需要更新
}
end=next;//新的起点
pre=start;//更新next
start.next=end;//之前断开的需要接回去
start=next;//新的起点
count++;
}
else{//不满足条件的话end继续向前走,直至为null
count++;
end=end.next;
}
}
return head;
}