一、题目内容

image.png

二、题解

解法1:

思路

注意换头情况
先记录left左边的pre,以及right

代码

  1. import java.util.*;
  2. public class Solution {
  3. public ListNode reverseBetween (ListNode head, int m, int n) {
  4. if(m == n){
  5. return head;
  6. }
  7. // write code here
  8. ListNode dummy = new ListNode(-1);
  9. dummy.next = head;
  10. int len = 0;
  11. ListNode cur = head;
  12. ListNode pre = null,right = null;
  13. while(cur!=null){
  14. len+=1;
  15. if(len == m-1){
  16. pre = cur;
  17. }
  18. if(len == n){
  19. right = cur;
  20. }
  21. cur = cur.next;
  22. }
  23. if(m > n || m < 1 || n > len){
  24. return head;
  25. }
  26. //换头
  27. if(pre == null){
  28. pre = dummy;
  29. }
  30. ListNode left = pre.next;
  31. pre.next = null;
  32. ListNode next = right.next;
  33. right.next = null;
  34. ListNode newLeft = reverse(left);
  35. left.next = next;
  36. pre.next = newLeft;
  37. return dummy.next;
  38. }
  39. private ListNode reverse(ListNode root){
  40. ListNode pre = null,cur = root;
  41. while(cur!=null){
  42. ListNode next = cur.next;
  43. cur.next = pre;
  44. pre = cur;
  45. cur = next;
  46. }
  47. return pre;
  48. }
  49. }