反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
思路
有空再补上
执行用时 : 0 ms, 在Reverse Linked List II的C++提交中击败了100.00% 的用户
内存消耗 : 8.5 MB, 在Reverse Linked List II的C++提交中击败了90.36% 的用户
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
int length=n-m+1;
ListNode* saveHead=NULL;//m的前一个
ListNode* saveTail;//n的后一个
ListNode* ret=head;
while(head&&--m){
saveHead=head;
head=head->next;
}
saveTail=head;
ListNode* retHead=NULL;
while(head&&length--){
ListNode* temp=head->next;
head->next=retHead;
retHead=head;
head=temp;
}
saveTail->next=head;
if(saveHead)
saveHead->next=retHead;
else
ret=retHead;
return ret;
}
};