8.23 第一次做,无法 AC
8.24 可以一次 AC


第一次复习
9.8 无法 AC
9.14 无法 AC
9.15 可以 AC,就是还是有点粗心的地方

题目描述


力扣:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/submissions/

解题思路


题解:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/

9.8 感悟:

  • 下面第 16 行要记得写!!!!

  • 第 12 行的 end.next 和第 16、20 行的 end != null 或 end == null 没有任何关系;

    • 第 12 行的 end.next != null 是判断是否需要进行下一趟遍历 K 个节点;
    • 而第 16、20 行的 end != null 或 end == null 是用来判断是否不足 K 个节点能够遍历而提前退出。

9.15 感悟:

  • 下面第 29 和 31 行代码一定得等于 start 节点,不能等于 end 节点,end 节点反转链表后已经到前面去了!!

    1. class Solution {
    2. public ListNode reverseKGroup(ListNode head, int k) {
    3. ListNode sentry = new ListNode(0);
    4. sentry.next = head;
    5. ListNode pre = sentry;
    6. ListNode end = sentry;
    7. // end.next != null 判断是否有节点能够继续开始下一趟 K 次遍历
    8. // 确实,得要 end.next != null,才有必要往前遍历 K 个节点,然后才能够反转链表
    9. while(end.next != null) {
    10. for(int i = 0; i < k; i++) {
    11. // end != null 判断是否不足 K 个节点而提前退出遍历
    12. if(end != null) end = end.next;
    13. }
    14. // end == null 就代表上面的 for 循环提前退出了,不足 K 个节点
    15. if(end == null) break;
    16. ListNode next = end.next; // 暂存 K 个一组链表的下一个节点,以便接回来
    17. end.next = null; // 断开 K 个一组链表与下一个节点的连接,以便反转链表成功
    18. ListNode start = pre.next; // 记录 K 个一组链表的头,以便传入反转方法进行反转
    19. pre.next = reverseList(start); // 返回反转链表后的头节点并将其接在 pre 后面
    20. start.next = next; // 刚刚的【头】反转后变成了尾节点,用其与原链表拼接起来
    21. pre = start; // 重置 pre
    22. end = start; // 重置 end
    23. }
    24. return sentry.next;
    25. }
    26. public ListNode reverseList(ListNode head) {
    27. ListNode pre = null, cur = head;
    28. while(cur != null) {
    29. ListNode tmp = cur.next;
    30. cur.next = pre;
    31. pre = cur;
    32. cur = tmp;
    33. }
    34. return pre;
    35. }
    36. }