题目描述
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
思路
1.使用迭代+递归的思想求解。
2.首先为了方便迭代,最好添加一个亚结点在头部,迭代到m的前一个结点pre。
3.然后按照206.反转链表的思路反转部分链表。
4.最后将pre的next指向反转后的头结点即可。
Java代码实现
public ListNode reverseBetween(ListNode head, int m, int n) { if(m == n) return head; int dis = n - m; ListNode p = new ListNode(-1); p.next = head; ListNode res = p; while(m > 1){ p = p.next; m--; } p.next = reverseNode(p.next,dis); return res.next; } private ListNode reverseNode(ListNode head, int dis){ if(dis == 0 || head == null || head.next == null) return head; ListNode p = reverseNode(head.next,dis-1); ListNode next = head.next.next; head.next.next = head; head.next = next; return p; }