题目

image.png

思路

  • 思路一:首先要计算链表的长度方便判断是否有足够长度反转,第二步使用头插法反转链表,需要注意的是在每次反转一段链表后,需要重置prev和head节点。

    代码

    1. public ListNode reverseKGroup(ListNode head, int k) {
    2. if (head == null || k == 1) return head;
    3. ListNode dummy = new ListNode(0);
    4. dummy.next = head;
    5. int len = 0;
    6. while(head != null) {
    7. len++;
    8. head = head.next;
    9. }
    10. head = dummy.next;
    11. ListNode prev = dummy;
    12. for(int j = len; len - k >= 0; len -= k) {
    13. //使用头插法插入节点
    14. for (int i = k; i > 1; i--) {
    15. ListNode next = head.next;
    16. head.next = next.next;
    17. next.next = prev.next;
    18. prev.next = next;
    19. }
    20. //重置节点
    21. prev = head;
    22. head = head.next;
    23. }
    24. return dummy.next;
    25. }
    K 个一组翻转链表