DAY.3链表中节点每k个一组翻转BM3
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录一、链表中节点每k个一组翻转二、代码2.解释总结一、链表中节点每k个一组翻转二、代码代码如下示例structListNode*reverseKGroup(structListNode*head,intk){// 1. 递归终止条件链表为空或剩余节点不足k个if(headNULL){returnNULL;}structListNode*tailhead;//先将尾节点初始为头节点for(inti0;ik;i){//分成k组if(tailNULL){returnhead;// 不足k个直接返回原链表头}tailtail-next;}// 2. 只反转 [head, tail) 区间的k个节点核心修改structListNode*preNULL;structListNode*currhead;structListNode*next;while(curr!tail){// 关键不是反转到NULL而是反转到tailnextcurr-next;curr-nextpre;precurr;currnext;}// 3. 递归处理后续节点并拼接当前段head-nextreverseKGroup(tail,k);returnpre;// pre是反转后当前段的新头节点}2.解释比如链表 1-2-3-4-5k2第一次递归head1tail 走到了第 3 个节点 3。反转 1-2 这一组反转后变成 2-1此时 pre2curr3和 tail 相遇循环结束。head-next reverseKGroup(tail, k)也就是让 1 的 next 指向 reverseKGroup(3, 2) 的结果。递归处理 3-4反转成 4-3再递归处理 5不足 2 个直接返回 5最终拼接成 2-1-4-3-5。总结一定要用 tail 标记下一组的起始位置反转只在 [head, tail) 区间内进行。反转后原来的 head 会变成当前组的尾节点所以要让 head-next 指向递归处理后的结果。递归终止条件一定要检查剩余节点是否够 k 个不够就直接返回原头。