25. K 个一组翻转链表
反转前k个很简单、需要记录后驱结点,但这不只有前k个,有多个前k个;
需要两个结点记录需要反转的链表的起点和终点,a,b
把a当起点,反转[a,b)链表!
在以b为起点当成另一个组递归,又会产生一个[a,b)
把第一个a接到第二个反转后的结点上!
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null) return null;
ListNode a = head,b = head;
//判断是否足够反转
for(int i = 0; i < k; i++){
if(b == null){
return head;
}
b = b.next;
}
//足够就反转[a,b)
ListNode newNode = reverseK(a,b);
//连接结点
a.next = reverseKGroup(b,k);
return newNode;
}
//反转区间结点
ListNode reverseK(ListNode a, ListNode b){
if(a.next == b){
return a;
}
ListNode last = reverseK(a.next, b);
a.next.next = a;
a.next = null;
return last;
}
}