当前位置:   article > 正文

leetcode 25 - k个一组反转链表_反转k个链表

反转k个链表

题目:



方法一:

一段一段地反转,利用三个指针,pre, cur, next,pre指向以及转换好的最后一个节点,cur指向当前要转换的节点,,next指向下一个要转换的节点



  1. public static ListNode reverseKGroup(ListNode head, int k) {
  2. if(head == null){
  3. return null;
  4. }
  5. int len = 0;
  6. ListNode dummyNode = new ListNode(-1);
  7. dummyNode.next = head;
  8. ListNode cur = dummyNode.next;
  9. while(cur != null){
  10. len++;
  11. cur = cur.next;
  12. }
  13. ListNode pre = dummyNode;
  14. cur = dummyNode.next;
  15. // 要转换的段数
  16. int n = len / k;
  17. while(n > 0 && cur != null){
  18. n--;
  19. //cur = dummyNode.next;
  20. ListNode next = cur.next;
  21. for(int i = 0; i < k - 1; i++){
  22. //System.out.println("cur.val = " + cur.next.val);
  23. cur.next = next.next;
  24. next.next = pre.next;
  25. pre.next = next;
  26. next = cur.next;
  27. }
  28. pre = cur;
  29. // 必不可少
  30. cur = cur.next;
  31. //print(dummyNode.next);
  32. }
  33. return dummyNode.next;
  34. }

方法二:

利用四个指针,pre, start, end, next,pre指向已经转换好的最后一个节点,start指向要开始转换的第一个节点,end指向最后一个要开始转换的节点,next指向下一段要开始转换的链表





  1. // 穿针引线法
  2. public static ListNode reverseKGroup2(ListNode head, int k) {
  3. ListNode dummyNode = new ListNode(-1);
  4. dummyNode.next = head;
  5. ListNode start = dummyNode;
  6. ListNode pre = dummyNode;
  7. ListNode end = dummyNode;
  8. while(end.next != null){
  9. for(int i=0;i<k && end != null;i++){
  10. end = end.next;
  11. }
  12. if(end == null){
  13. break;
  14. }
  15. //要截取的区间
  16. start = pre.next;
  17. ListNode next = end.next;
  18. end.next = null;
  19. // 反转截取到的一段链表
  20. pre.next = reverseList(start);
  21. start.next = next;
  22. pre = start;
  23. end = pre;
  24. }
  25. return dummyNode.next;
  26. }
  27. // 链表反转 leetcode206 借助虚拟头节点
  28. public static ListNode reverseList(ListNode head) {
  29. if(head == null){
  30. return null;
  31. }
  32. ListNode ans = new ListNode(-1);
  33. ListNode cur = head;
  34. while(cur != null){
  35. ListNode next = cur.next;
  36. cur.next = ans.next;
  37. ans.next = cur;
  38. cur = next;
  39. }
  40. // 返回的是 ans的下一个节点
  41. return ans.next;
  42. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/598295
推荐阅读
相关标签
  

闽ICP备14008679号