反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseBetween(struct ListNode* head, int m, int n){
assert(m<=n);
struct ListNode* search=head;
struct ListNode* reverse_start=NULL;
struct ListNode* reverse_end=NULL;
struct ListNode* reverse_tmp=NULL;
struct ListNode* save=NULL;
int count=0;
while(search&&count<=n-1)
{
count++;
if(count==m-1)
{
reverse_start=search;
}
save=search;
search=search->next;
if(count==m)
{
reverse_tmp=save;
reverse_end=save;
reverse_end->next=NULL;
reverse_tmp->next=NULL;
}
else
{
if(reverse_tmp)
{
save->next=reverse_tmp;
reverse_tmp=save;
}
}
}
if(reverse_start)
{
reverse_start->next=reverse_tmp;
}
else
{
head=reverse_tmp;
}
reverse_end->next=search;
return head;
}
执行用时 : 0 ms, 在Reverse Linked List II的C提交中击败了100.00% 的用户
内存消耗 : 7.1 MB, 在Reverse Linked List II的C提交中击败了82.08% 的用户