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.
分成3段,将中间那段reverse,然后三段拼起来即可。
这里设置了一个虚拟头结点
ListNode* p=new ListNode(-1);
这样可以方便的解决m=1的问题。
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
ListNode* node = head;
if(m==n)
return head;
int len=0;
while(node!=NULL){
len++;
node = node->next;
}
ListNode* p=new ListNode(-1);
p->next=head;
head = p;
ListNode* q = p;
for(int i=0;i<m-1;i++)
p=p->next;
for(int i=0;i<n;i++)
q=q->next;
node = q->next;
q->next=NULL;
q = node;
ListNode* mid = reverse(p->next);
p->next = mid;
while(mid->next!=NULL)
mid = mid->next;
mid->next = q;
return head->next;
}
ListNode* reverse(ListNode* head){
ListNode* h=NULL;
while(head!=NULL){
ListNode* tmp = head;
head = head->next;
tmp->next =h;
h = tmp;
}
head = h;
return head;
}
};