92:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
代码及解析:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
class Solution {
ListNode successor = null;//后驱节点
public ListNode reverseBetween(ListNode head, int m, int n) {
//开始反转从位置m到n的链表
if(m == 1){
//相当于反转链表的前n个元素
return reversN(head,n);
}
//前进到反转的起点
head.next = reverseBetween(head.next,m-1,n-1);
return head;
}
//先从反转链表的前n个元素开始
//反转以head为起点的n个节点
ListNode reversN(ListNode head,int n){
if(n == 1){
//记录n+1个节点
successor = head.next;
return head;
}
//以head.next为起点,需要反转n-1个节点
ListNode last = reversN(head.next,n-1);
head.next.next = head;
head.next = successor;
return last;
}
}