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.
解法:遍历链表,找到第一个节点reverseBefore(反转链表的前一个节点),从reverseHead到reverseTail反转链表,并标记reverseBehind(反转链表的后面一个节点)。最后通过这几个节点将链表拼接起来。
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(!head||m==n) return head;
ListNode* phead = new ListNode(0);
phead->next = head;
ListNode* reverseHead,*reverseTail,*reverseBefore=phead,*reverseBehind= NULL;
int i=0;
for(i;i<m-1;i++){
reverseBefore = reverseBefore->next;
if(!reverseBefore) return NULL;
}
reverseHead = reverseBefore->next;
ListNode* pre = NULL;
ListNode* next = NULL;
reverseTail = reverseHead;
for(i=m;i<=n;i++){
if(!reverseTail) return NULL;
if(i==n){
reverseBehind = reverseTail->next;
reverseTail->next = pre;
}
else{
next = reverseTail->next;
reverseTail->next = pre;
pre = reverseTail;
reverseTail = next;
}
}
reverseBefore->next = reverseTail;
reverseHead->next = reverseBehind;
return phead->next;
}
};