1629383377013-c3028385-2024-4730-b0b6-a0dfa1e85403-1630981405693.png

1.理解题意

我们需要将一个链表,按每k个为一组进行反转,不足k个的组不进行反转。

2.解题步骤

  1. 检查当前链表够不够分组
    • 不够分成k个,直接返回当前链表的头结点
    • 够分成k个,则继续
  2. 反转当前链表的前K个结点
  3. 反转下一组的前K个结点

上面是基本的步骤,其中还有一些细节问题,需要探究。

  1. 反转后怎么进行连接呢?要定义什么变量保存结点信息?

这是问题的关键,因为反转后会返回反转链表的头结点,所以需要保存这个结点用于返回,那么返回后由谁来接收呢?需要上一个反转的链表的尾部来接收,这样才能将各自反转的链表连接在一起。

k个一组反转链表.jpg

  1. 怎么反转前K个结点?需要什么参数?

反转链表前K个结点的方式就两种,一种是递归方式,一种是迭代方式。

需要的参数取决于我们如何判断结束的条件,可以用K,也可以使用第K个结点或者是第K+1个结点,都没有问题,这和用递归方式还是迭代方式无关。

关于反转前K个结点详情看

3.具体代码

  1. class Solution {
  2. public ListNode reverseKGroup(ListNode head, int k) {
  3. if(head == null) return null;
  4. // 要有两个变量
  5. //一个用来指向当前的头结点,用来在反转后指向后面的链表
  6. //一个用来传递给下一组要反转的链表
  7. ListNode a, b;
  8. a = b = head;
  9. //1.检查当前链表的结点数还够不够反转
  10. for(int i = 0; i < k; i++){
  11. if(b == null) return head;
  12. b = b.next;
  13. }
  14. //2.反转当前链表的前k个结点
  15. ListNode newHead = reverseK(a, b);
  16. //3.继续反转下一组链表
  17. a.next = reverseKGroup(b, k);
  18. return newHead;
  19. }
  20. //传入第K+1个结点作为结束条件(迭代)
  21. public ListNode reverseK(ListNode a, ListNode b){
  22. ListNode prev, cur, nxt;
  23. prev = null; cur = nxt = a;
  24. while(cur!=b){
  25. nxt = cur.next;
  26. cur.next = prev;
  27. prev = cur;
  28. cur = nxt;
  29. }
  30. return prev;
  31. }
  32. //传入K作为结束条件(迭代)
  33. public ListNode reverseK(ListNode a, int n){
  34. ListNode prev, cur, nxt;
  35. prev = null; cur = nxt = a;
  36. while(n-- != 0){
  37. nxt = cur.next;
  38. cur.next = prev;
  39. prev = cur;
  40. cur = nxt;
  41. }
  42. return prev;
  43. }
  44. //传入K作为结束条件(递归)
  45. public ListNode reverseK(ListNode a, int n){
  46. if(n == 1){
  47. return a;
  48. }
  49. ListNode Last = reverseK(a.next, n-1);
  50. ListNode tail = a.next.next;
  51. a.next.next = a;
  52. a.next = tail;
  53. return Last;
  54. }
  55. //传入第K+1个结点作为结束条件(递归)
  56. public ListNode reverseK(ListNode a, ListNode b){
  57. if(a.next == b) return a;
  58. ListNode Last = reverseK(a.next, n-1);
  59. ListNode tail = a.next.next;
  60. a.next.next = a;
  61. a.next = tail;
  62. return Last;
  63. }
  64. }