BM3 题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
问题反省:
链表的问题,为什么很顽固,究根问底还是自己对于一些细节和知识的掌握不牢固,甚至有模凌两可的情况出现,比如下面的,
这个for(int i=0; i<k; i++) {
// 循环体
}
这个理解就不到位,会导致具体代码会遍历到那个节点,逻辑判断和执行的时候,自己有点懵圈了,其实实际情况是这样的。
整个for循环,可以分成三部分:
for(表达式1;表达式2;表达式3){
// 循环体
}
第1次执行的过程是: 表达式1->表达式2->循环体->表达式3
第2次到最后前一次的执行过程是:表达式2->循环体->表达式3
最后一次的执行过程是:表达式2 停止了
所以,可以总结的一个过程是, 12循3,2循3,2完!
具体参考:https://blog.csdn.net/weixin_42295859/article/details/114044468
解题思路:链表反正+递归
1、首先,利用一个for循环,找到下k个翻转链表的头,也就是当前链表的尾部。
2、之后,反转当前链表,因为下个链表头知道了,就不怕断链
3、最后,把当前的链表尾,也就是旧的head.next指向下个反转链表的头。
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 链表中的节点每k个一组翻转 * @param head ListNode类 * @param k int整型 * @return ListNode类 */ public ListNode reverseKGroup (ListNode head, int k) { // 找到链表尾,也就是下k个反转链表的头 ListNode tail = head; for(int i=0; i<k; i++) { if(tail == null) { return head; } tail = tail.next; } // 反转当前段的链表 ListNode prev = null; ListNode curr = head; while(curr!=tail) { ListNode temp = curr.next; curr.next = prev; prev = curr; curr = temp; } // 把下个翻转的链表头赋值给当前的空链表尾 head.next = reverseKGroup(tail, k); return prev; } }