92. 反转链表 II

92. 反转链表 II


反转从位置 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.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public  ListNode reverseBetween(ListNode head, int m, int n) {
         if (head == null) {
            return null;
        }
        if (head.next == null || (m - n == 0)) {
            return head;
        }
        ListNode cur = head;
        ListNode pre = null;
        while (--m != 0) {
            n--;
            pre = cur;
            cur = cur.next;
        }
        ListNode next = cur.next;
        ListNode con = pre;
        ListNode tail = cur;
        while (n-- != 0) {
            next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        if (con == null) {
            head = pre;
        } else {
            con.next = pre;
        }
        tail.next = cur;
        return head;
    }
}
示例: 1->2->3->4->5->NULL, m = 2, n = 4
依题意,要反转 2->3->4 这一部分
首先先从m=2下手,获取cur指向2以及pre指向1,
得到n = n-m +1= 3;即从cur = 2开始需要反转的链长为3,此时需要额外保存一个指针con始终指向当前cur
即cur = 2,以及一个tail指针始终指向pre;
现在进入循环中,共循环了3次,每次
	next = cur.next;
	cur.next = pre;
	pre=cur;
	cur=next;
循环结束后,cur应当指向5,pre指向4,next指向5,加上原本tail指向2,con指向1;
之后设置con.next = pre(1->4);tail.next = cur(2->5);
然后还有一种情况需要考虑,就是m = 1这类情况,con = null;此时相当于反转前n个节点,
令 head = pre即可;最后返回head;
示例: 1->2->3->4->5->NULL, m = 2, n = 4
	1.cur = head;//值为1;pre=null;
		m=2;
			while(--m!=0);//m=1,m!=0
				n--;
				pre = cur;//值为1
				cur = cur.next;//值为2;
			while(--m!=0);//m=0,m!=0?否,退出循环
	 2.此时 m=0;n = 3;cur指向2;pre指向1;
	 	next =null;
	 	con = pre;//指向1;
	 	tail = cur;//指向 2;
	 3.while(n--!=0);n = 3;n!=0;n = 2;
	 		next = cur.next ;//值为 3;
	 		cur.next = pre;//此时  1 < - 2->3->4->5->NULL
	 		pre = cur;//值为2
	 		cur = next;//值为3;
	 	while(n--!=0);n=2;n!=0;n=1;
	 		next = cur.next;//值为4;
	 		cur.next = pre;//此时   1 < - 2< -3->4->5->NULL
	 		pre = cur;//值为3;
	 		cur = next;//值为4;
	 	while(n--!=0);n=1;n!=0;n=0;
	 		next = cur.next;//值为5;
	 		cur.next = pre;//此时   1 < - 2< -3< -4->5->NULL
	 		pre = cur;//值为4;
	 		cur = next;//值为5;
	 	while(n--!=0);n = 0;退出循环
	 		得到 1 < - 2< -3< -4->5->NULL
	此时若con!=null;con.next = pre;//1->4;
			1 < - 2< -3< -4->5->NULL
			tail.next = cur;//2->5
			故:1->4->3->2->5->null;

现在来示例上述的一种情况,即m = 1,n=4(相当于反转前n个节点);
	1.cur = head;//cur=1
	   pre = null;
	   while(--m!=0);//不循环
	 2.next = null;
	 	con = pre=null;
	 	tail = cur;//tail = 1;
	 3.while(n--!=0);n = 4;n!=0;n=3;
	 		next = cur.next;//next = 2;
	 		cur.next = pre;//		1 ->null    2 ->3->4->5->NULL
	 		pre = cur;//pre = 1;
	 		cur=next;//cur = 2;
	 	while(n--!=0);n=3;n!=0;n=2;
	 		next = cur.next;//next = 3;
	 		cur.next = pre;// 	    null <- 1  < -  2 -> 3->4->5->NULL
	 		pre = cur;//pre=2;
	 		cur = next;//cur = 3;
	 	while(n--!=0);n=2;n!=0;n=1;
	 		next = cur.next;//next = 4;
	 	 	cur.next = pre;// 	    null <- 1  <- 2 < - 3->4->5->NULL
	 		pre = cur;//pre=3;
	 		cur = next;//cur = 4;
	 	while(n--!=0);n=1;n!=0;n=0;
	 		next = cur.next;//next = 5;
	 	 	cur.next = pre;// 	    null <- 1  <- 2 < - 3 < - 4->5->NULL
	 		pre = cur;//pre=4;
	 		cur = next;//cur = 5;
	 	循环结束;
	 		此时 null <- 1  <- 2 < - 3 < - 4->5->NULL
	 		con = null;
	 		tail  = 1;
	 		cur = 5;
	 		pre=4;
	 		注意:始终 head = 1;
	 		故令head= pre;//head = 4;
	 		tail.next = cur;//1->5;
	 		故:4->3->2->1->5->null;
	
	 		
			
	



你可能感兴趣的:(92. 反转链表 II)