题目
思路
- 思路一:找到第m - 1个节点,以其为起点,对m~n节点使用头插法插入到第m个节点的后面
思路二:使用递归找到m - 1各节点,然后再反转链表关键在反转链表的时候记录n+1的节点,head.next = successor确保反转后的链表指向后续未反转的链表
代码
//1. 迭代public ListNode reverseBetween(ListNode head, int m, int n) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode pre = dummy;for (int i = 1; i < m; i++) {pre = pre.next;}head = pre.next;//以第m个节点为起点,使用头插法插入m~n的节点for (int i = m; i < n; i++) {ListNode next = head.next;head.next = next.next;next.next = pre.next;pre.next = next;}return dummy.next;}//2. 递归ListNode successor = null;public ListNode reverseBetween(ListNode head, int m, int n) {if (m == 1) {return reverseN(head, n);}head.next = reverseBetween(head.next, m - 1, n - 1);return head;}public ListNode reverseN(ListNode head, int m) {if (m == 1) {successor = head.next;return head;}ListNode nHead = reverseN(head.next, m - 1);head.next.next = head;head.next = successor;return nHead;}
