. - 力扣(LeetCode)
一、题目描述
二、过程模拟
1. 第一步
2. 第二步:子链表分组
3. 第三步:断开前后两组
4. 第四步:翻转start到end的部分
5. 第五步:连接翻转好的前半部分和未翻转的后半部分,并重置pre和end
三、完整代码
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || head.next == null) return head;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy;
ListNode end = dummy;
while(end != null){
for(int i=0; i<k && end != null; ++i){
end = end.next;
}
if(end == null){
break;
}
ListNode start = pre.next;
ListNode next = end.next;
end.next = null;
pre.next = reverse(start);
start.next = next;
pre = start;
end = start;
}
return dummy.next;
}
public ListNode reverse(ListNode head){
ListNode pre = null;
ListNode cur = head;
while(cur != null ){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}