zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    【BZOJ 1455】罗马游戏
    【UR #2】树上GCD
    1067: [SCOI2007]降雨量
    1068: [SCOI2007]压缩
    1066: [SCOI2007]蜥蜴
    1065: [NOI2008]奥运物流
    1064: [Noi2008]假面舞会
    1063: [Noi2008]道路设计
    2329: [HNOI2011]括号修复
    2734: [HNOI2012]集合选数
  • 原文地址:https://www.cnblogs.com/doudouyoutang/p/9484727.html
Copyright © 2011-2022 走看看