问题:
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
.
特殊输入:
m=n,即逆转的部分只有一个结点。
m=1,从首结点就开始逆转。
n=尾结点。
思路:m为1时首结点需要逆转,这个过程会不一致。因此引入空头结点,使得代码保持一致。
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if(m >= n)
return head;
ListNode *newhead = new ListNode(0);//辅助空头结点
newhead->next = head;
ListNode *p = newhead, *q = newhead;
while(m>1)
{
m--;
p = p->next;
}
//p 指向旋转部分的前一个结点
while(n>=0)
{
n--;
q = q->next;
}
//q 指向旋转部分的下一个结点
ListNode *pre, *cur, *last;
pre = p->next;
cur = pre->next;
last = cur->next;
pre->next = q; //链接到q
while(cur != q)
{
cur->next = pre;
pre = cur;
cur = last;
if(last != NULL)
last = last->next;
}
p->next = pre; //从p链接
p = newhead->next; //提前释放空头结点
delete newhead;
return p;
}
};