Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
【对于涉及head节点的操作,不如ListNode *dummy = new ListNode(0); dummy->next = head;;使针对head节点的处理与其他节点一致。最后返回dummy->next作为头指针即可。】
思路:1.分两部分,第一部分找mNode,第二部分把cur插入到mNode前面,注意不是后面,因为mNode会自动排到最后。
2.注意对curr操作的几个步骤。
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n){
if(head==null)
return null;
//--------------------------------------------PART1-----------------------------
ListNode dummy=new ListNode(0);//-dummy-
dummy.next=head;
ListNode preMNode=dummy;//--pre--
int i=1;//--------------------find mNode below---------------------
while(preMNode.next!=null && i<m){//actually,theres no dif xx!=null or pre.next!=null. just which var exist here.
preMNode=preMNode.next;
i++;
}
ListNode mNode=preMNode.next;//use i=1 to verify
//----------------------------------------------PART2---------------------------
ListNode cur=mNode.next;//since we need cur now,we define it here....this is called "clear logic"
while(cur!=null && i<n){// preMNode->mNode -> cur-> next->, since we op cur ,so it checks cur!=null.
ListNode next=cur.next;//just remember the pic and these four ops.
cur.next=preMNode.next;
preMNode.next=cur;
mNode.next=next;
i++;
cur=next;
}
return dummy.next;//not return head!
}
}