92. Reverse Linked List II

一、题目分析

  题目要求逆转链表的第m到第n个之间的结点,因此思路是,讲m和n之间的结点单独拎出来作为一个单独的链表,进行逆转

  然后问题退化为,逆转一个单链表。

  可以采用递归的方式,每次传入上一个结点和当前结点,将当前结点指向上一个结点

  然后将当前结点和下一个结点再次调用该方法

  代码如下所示:

class Solution {
public:
    //逆转链表,head是下部分的链表头,last是上一个节点。
    ListNode* reverseList(ListNode* head, ListNode* last)
    {
        if(head)
        {
            ListNode* next = head->next;
            head->next = last;
            return this->reverseList(next, head);
        }
        return last;
    }
    
    //逆转链表,第m->n个节点
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        
        ListNode *dummy = new ListNode(-1);
        dummy->next = head;
        
        ListNode *p = dummy;
        ListNode *pLeftPrev = NULL, *pLeft = NULL, *pRight = NULL, *pRightNext = NULL;
        for (int i = 0; i <= n && p; i++) {
            
            if(i == m - 1)
            {
                pLeftPrev = p;
                pLeft = p->next;
            }
            
            if(i == n)
            {
                pRight = p;
                pRightNext = p->next;
            }
            
            p = p->next;
        }
        
        pRight->next = NULL;
        this->reverseList(pLeft, NULL);
        
        pLeftPrev->next = pRight;
        pLeft->next = pRightNext;
        p = dummy->next;
        free(dummy);
        
        return p;
    }
};

 

posted @ 2018-08-15 23:41  兜兜有糖的博客  阅读(147)  评论(0编辑  收藏  举报