【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;
    }

 

posted @ 2015-03-12 21:36  匡子语  阅读(185)  评论(0编辑  收藏  举报