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.
Have you met this question in a real interview?
思路:对于一个链表: head->...->headstart->headtail(第m位)->第m+1位->...->pre(第n位)->cur(第n+1位)->.....->NULL
我们只需要略过链表前m-1个结点,将[m,n]中的结点反转,headtail指向cur完成没有反转结点的链接。
值得注意的是,headstart->next=pre(如果headstart不为空的话)
反转后的链表为:
(1)head->...->headstart->pre>...->headtail->cur(第n+1位)->.....->NULL(headstart!=NULL)
(2)pre>...->headtail->cur(第n+1位)->.....->NULL(headstart==NULL)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if(head==NULL||head->next==NULL)
return head;
if(m==n)
return head;
int num=1;
ListNode * pre=NULL;
ListNode * cur=NULL;
ListNode * post=NULL;
ListNode * headstart=NULL;
ListNode * headend=head;
ListNode * tailstart=NULL;
while(num<m)
{
headstart=headend;
headend=headend->next;
num++;
}
pre=headend;
tailstart=pre;
cur=pre->next;
pre->next=NULL;
while(num<n)
{
post=cur->next;
cur->next=pre;
pre=cur;
cur=post;
num++;
}
tailstart->next=cur;
if(headstart!=NULL)
headstart->next=pre;
else
head=pre;
return head;
}
};