题目

image.png

思路

  • 思路一:找到第m - 1个节点,以其为起点,对m~n节点使用头插法插入到第m个节点的后面
  • 思路二:使用递归找到m - 1各节点,然后再反转链表关键在反转链表的时候记录n+1的节点,head.next = successor确保反转后的链表指向后续未反转的链表

    代码

    1. //1. 迭代
    2. public ListNode reverseBetween(ListNode head, int m, int n) {
    3. ListNode dummy = new ListNode(0);
    4. dummy.next = head;
    5. ListNode pre = dummy;
    6. for (int i = 1; i < m; i++) {
    7. pre = pre.next;
    8. }
    9. head = pre.next;
    10. //以第m个节点为起点,使用头插法插入m~n的节点
    11. for (int i = m; i < n; i++) {
    12. ListNode next = head.next;
    13. head.next = next.next;
    14. next.next = pre.next;
    15. pre.next = next;
    16. }
    17. return dummy.next;
    18. }
    19. //2. 递归
    20. ListNode successor = null;
    21. public ListNode reverseBetween(ListNode head, int m, int n) {
    22. if (m == 1) {
    23. return reverseN(head, n);
    24. }
    25. head.next = reverseBetween(head.next, m - 1, n - 1);
    26. return head;
    27. }
    28. public ListNode reverseN(ListNode head, int m) {
    29. if (m == 1) {
    30. successor = head.next;
    31. return head;
    32. }
    33. ListNode nHead = reverseN(head.next, m - 1);
    34. head.next.next = head;
    35. head.next = successor;
    36. return nHead;
    37. }

    反转链表II