25. K 个一组翻转链表
递归+双指针

根据算法思路:
- 先反转以head开头的k个元素

- 将第k+1个元素作为head递归调用reverseGroup函数

- 将上面两个过程的结果连接起来

如何反转以head开头的k个元素:
初始化三个指针分别指向pre、current、next三个节点,让pre指向null,current和next指向节点a。循环翻转节点直到current指向节点b,每次循环,next应该是current的下一个节点,然后将current的下一节点指向前一个来完成反转,最后更新指针位置。
//反转a到b之间的节点private ListNode reverse(ListNode a, ListNode b){//前一个、当前、后一个节点ListNode pre = null, cur = a, nxt = a;while(cur != b){nxt = cur.next;//逐个节点反转cur.next = pre;//更新指针位置pre = cur;cur = nxt;}//返回反转后的头节点return pre;}public ListNode reverseKGroup(ListNode head, int k) {if(head == null) return null;//区间[a, b) 包含k个待反转的元素ListNode a, b;a = b = head;//让b到达第k个节点for(int i = 0; i < k; i++){//如果不足k个,则不需要反转,base caseif(b == null) return head;b = b.next;}//翻转前k个元素ListNode newHead = reverse(a, b);//递归反转后续链表并连接起来a.next = reverseKGroup(b, k);return newHead;}
