链表中的节点每k个一组翻转
图解:
思路:
1.每k个节点进行分组,如果不够就直接返回头结点,表示不需要进行反转
2.将每个分组中的k个节点进行反转
3.将反转后的尾(即反转前的头)与后面一个区间反转后的头相连:用递归
## 代码:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
public ListNode reverseKGroup (ListNode head, int k) {
//每次找到这次分组的最后一个节点的后一个位置,即下一次分组的首个节点
ListNode tail=head;
for(int i=1;i<=k;i++){
//注意如果该分组不满足k个元素,那么就直接返回头节点,表示不用反转
if(tail==null){
return head;
}
tail=tail.next;
}
//反转区间
ListNode pre=null;
ListNode cur=head;
while(cur!=tail){
ListNode cur_next;
cur_next=cur.next;
cur.next=pre;
pre=cur;
cur=cur_next;
}
//将当前这个区间反转前的头(即反转后的尾)与下一次反转后的头相连
//由于后面进行反转操作是相同的,所以可以用递归的思想
head.next=reverseKGroup(tail,k);
//每次返回反转后的区间的头结点
return pre;
}
}