NO.92 反转链表II

反转从位置 mn 的链表。请使用一趟扫描完成反转。

说明:
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% 的用户

猜你喜欢

转载自blog.csdn.net/xuyuanwang19931014/article/details/91038936