Reverse Linked List II

Q: 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.

Note:
Given mn satisfy the following condition:
1 <= m <= n <=length of list.

A: 要小心循环次数!

    ListNode *reverseBetween(ListNode *head, int m, int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(m==n||!head)
            return head;
        ListNode *tail = NULL,*prev = NULL,*cur,*temp,*next=NULL;  //temp:reverse部分的head,tail:reverse部分的tail,prev:需要reverse部分的前一个节点
        
        cur = head;
        int count = 0;
        while(count<m-1)
        {
            prev = cur;
            cur = cur->next;
            count++;
        }
        
        temp = tail = cur;
        cur = cur->next;
        
        while(count<n-1)
        {
            if(prev)
                prev->next = cur;
            next = cur->next;
            cur->next = temp;
            temp = cur;
            count++;
            cur = next;
        }
        tail->next = cur;
        
        return (prev?head:temp);
    }

 思路完全一样,注意循环次数即可。

    ListNode *reverseBetween(ListNode *head, int m, int n) {
        // Note: The Solution object is instantiated only once and is reused by each test case. 
        if(m==n||!head)
            return head;
        ListNode* prev,*cur,*reverseHead,*reverseTail,*next;
        prev = NULL;
        
        int i;
        
        reverseHead = head;
        for(i=0;i<m-1;i++)
        {
            prev = reverseHead;
            reverseHead = reverseHead->next;
        }
        ListNode* tmp = reverseHead;
        next = reverseHead->next;
        while(i<n-1)
        {
            cur = next;
            next = cur->next;
            cur->next = tmp;
            tmp = cur;
            ++i;
        }
        
        reverseTail = cur;
        reverseHead->next = next;
        if(!prev)
            return reverseTail;
        else
        {
            prev->next = reverseTail;
            return head;
        }
        
    }

  

    void reverse(ListNode* prev,ListNode* next)
    {
        ListNode* last = prev->next;
        ListNode* cur = last->next;
        while(cur!=next)
        {
            last->next = cur->next;
            cur->next = prev->next;
            prev->next = cur;
            cur = last->next;
        }
    }
    ListNode *reverseBetween(ListNode *head, int m, int n) {
        // Note: The Solution object is instantiated only once and is reused by each test case. 
        if(m==n||!head)
            return head;
        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* prev = dummy,*next;
        int i = 0;
        while(i<m-1)
        {
            prev = prev->next;
            ++i;
        }
        next = prev;
        while(i<n+1)
        {
            next = next->next;
            ++i;
        }
        
        reverse(prev,next);  //reverse一个区间
        ListNode* newHead = dummy->next;
        delete dummy;
        return newHead;
   /*     ListNode* prev,*cur,*reverseHead,*reverseTail,*next;
        prev = NULL;
        
        int i;
        
        reverseHead = head;
        for(i=0;i<m-1;i++)
        {
            prev = reverseHead;
            reverseHead = reverseHead->next;
        }
        ListNode* tmp = reverseHead;
        next = reverseHead->next;
        while(i<n-1)
        {
            cur = next;
            next = cur->next;
            cur->next = tmp;
            tmp = cur;
            ++i;
        }
        
        reverseTail = cur;
        reverseHead->next = next;
        if(!prev)
            return reverseTail;
        else
        {
            prev->next = reverseTail;
            return head;
        }*/
        
    }

  

posted @ 2013-06-18 11:21  summer_zhou  阅读(155)  评论(0编辑  收藏  举报