image.png

思路

image.png
image.png

code

  1. public ListNode reverseKGroup(ListNode head, int k) {
  2. //定义虚拟头结点
  3. ListNode dummy = new ListNode(0);
  4. dummy.next= head;
  5. //待反转链表的pre
  6. ListNode pre = dummy;
  7. //待反转链表的end
  8. ListNode end = dummy;
  9. //遍历一遍
  10. while(end.next!=null){
  11. //end迭代k次到达最后
  12. for(int i=0;i<k&&end!=null;i++)
  13. end = end.next;
  14. //如果end到达了最后则跳出循环
  15. if(end ==null)
  16. break;
  17. //待反转链表的start
  18. ListNode start = pre.next;
  19. //还未反转的部分的第一个元素 即为next
  20. ListNode next = end.next;
  21. //将待反转链表断掉
  22. end.next = null;
  23. //将pre的next执行反转之后的部分
  24. pre.next = reverse(start);
  25. //反转之后start为最后一个 重新连接上
  26. start.next = next;
  27. //更新pre 和end
  28. pre = start;
  29. end = start;
  30. }
  31. return dummy.next;
  32. }
  33. ///常规的反转链表
  34. public ListNode reverse(ListNode head){
  35. ListNode pre = null;
  36. ListNode curr = head;
  37. while(curr!=null){
  38. ListNode next = curr.next;
  39. curr.next = pre;
  40. pre = curr;
  41. curr = next;
  42. }
  43. return pre;
  44. }