【leetcode】Reverse Linked List II (middle)

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->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

 

思路:

好困啊,脑子晕晕的。 转了半天AC了。但写的很罗嗦,要学习大神的写法。 注意翻转的写法。

用伪头部 

大神14行简洁代码

 ListNode *reverseBetween(ListNode *head, int m, int n) {

    if(m==n)return head;

    n-=m;

    ListNode prehead(0);

    prehead.next=head;

    ListNode* pre=&prehead;

    while(--m)pre=pre->next;        

    ListNode* pstart=pre->next;

    while(n--)

    {

        ListNode *p=pstart->next;

        pstart->next=p->next;

        p->next=pre->next;

        pre->next=p;

    }

    return prehead.next;

}

 

我的繁琐代码

ListNode *reverseBetween(ListNode *head, int m, int n) {

        ListNode fakehead(0);

        ListNode * p = &fakehead;

        for(int i = 1; i < m; i++)

        {

            p = p->next = head;

            head = head->next;

        }

        p->next = NULL; //m前的那一节末尾



        ListNode *ptail = head; //翻转那一段的尾巴

        ListNode *p1 = head, *p2 = NULL, *p3 = NULL;

        if(p1->next != NULL)

        {

            p2 = p1->next;

        }

        p1->next = NULL;

        for(int i = m; i < n; i++)

        {

            p3 = p2->next;

            p2->next = p1;

            p1 = p2;

            p2 = p3;

        }



        p->next = p1;

        ptail->next = p2;



        return fakehead.next;

    }

 

你可能感兴趣的:(LeetCode)