原題:
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恰好等1或者n恰好爲鏈表的長度。其他的就很簡單了,可以AC的C++代碼如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *reverse(ListNode *head){
if(!head || !head->next){
return head;
}
ListNode *first = head;
ListNode *second = head->next;
ListNode *temp = NULL;
while(second){
temp = second->next;
second->next = first;
first = second;
second = temp;
}
head->next = NULL;
return first;
}
ListNode *reverseBetween(ListNode *head, int m, int n) {
if(m > n || m < 1 || n < 1)
return NULL;
if(m == n){
return head;
}
int length = 0;
ListNode *pHead = head;
while(pHead){
length ++;
pHead = pHead->next;
}
pHead = head;
if(length < n){
return NULL;
}
ListNode *start, *end, *middle = NULL;
length = 0;
while(pHead){
length ++;
if(length == m)
start = pHead;
if(length == m-1)
middle = pHead;
if(length == n)
end = pHead;
pHead = pHead->next;
}
pHead = end->next;
end->next = NULL;
ListNode *part = reverse(start);
if(middle)
middle->next = part;
else
head = part;
while(part && part->next){
part = part->next;
}
part->next = pHead;
return head;
}
};