題目:
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;
}