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.
遍历一下,找到m,n,记录m的前驱和n的后继,对m到n这一段调用单链表反转
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n)
{
int cnt=1;
ListNode dummy=new ListNode(-1);
dummy.next=head;
ListNode prev=dummy;
ListNode p=head;
ListNode leftprev=prev;
ListNode lefthead=p;
ListNode righthead=p;
ListNode rightnext=p.next;
while(p!=null)
{
prev=p;
p=p.next;
cnt++;
if(cnt==m)
{
leftprev=prev;
lefthead=p;
}
if(cnt==n)
{
righthead=p;
rightnext=p.next;
}
}
righthead.next=null;
leftprev.next=reverse(lefthead);
lefthead.next=rightnext;
return dummy.next;
}
private ListNode reverse(ListNode head)
{
if(head==null)
return head;
ListNode prev=head;
ListNode p=head.next;
ListNode pnext=null;
while(p!=null)
{
pnext=p.next;
p.next=prev;
prev=p;
p=pnext;
}
head.next=null;
return prev;
}
}