题目:
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]之间的noed反转。
思路:
找到第m个node,开始反转,一直到第n个node。
在处理过程中,要注意m=1开始反转的用例,这个时候,应该改变原始链表head指针的指向;当m=n时,是不需要进行反转的。
代码:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(m == n || !head) return head;
ListNode* lHead = head;
ListNode* lHead_before = new ListNode(0);
ListNode* last;
ListNode* last_next;
ListNode* pre;
int start = m - 1;
int end = n -1;
while(start != 0)
{
lHead_before = lHead;
lHead = lHead->next;
start --;
end --;
}
last = lHead;
last_next = lHead->next;
while(end != 0)
{
pre = last;
last = last_next;
last_next = last->next;
last->next = pre;
end = end - 1;
}
if(m == 1)
{
head = last;
lHead ->next = last_next;
}
else
{
lHead_before->next = last;
lHead->next = last_next;
}
return head;
}