题目描述
反转从位置 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;
}