【leetcode】-92-翻转链表

虽然时间复杂度,空间复杂度都不怎么样,好歹是自己写出来的

ListNode* reverseBetween(ListNode* head, int left, int right) {
        //创建头结点
        //标记第n+1个结点
        //标记第n个结点,并从n结点处断开
        //标记第m个结点,以便后续的连接工作
        //以m-1个结点为头结点,进行头插
        //将剩下的结点连接到链表尾部(表尾是原来的m处)
        if(head->next==nullptr||left==right)return head;

        ListNode* Dummy=new ListNode();//头结点
        Dummy->next=head;

        ListNode* m=nullptr;
        ListNode* n=nullptr;
        ListNode* m_1=Dummy;
        ListNode* n_1=nullptr;//m_1是m-1,n_1是n+1;

        int k=left;
        while(k-1!=0){
            m_1=m_1->next;
            k--;
        }
        m=m_1->next;//m_1是待翻转链表的头结点,m是链表反转后的尾结点
        n=m;
       

        while(right!=left){            
            n=n->next;
            right--;          
        } 

        n_1=n->next;//n是待翻转链表的尾结点,n_1是后序链表的头结点
        n->next=nullptr;//断开
   
        //初始化完毕,开始翻转
        m_1=reverse(m_1); 
        //将翻转后的链表和尾巴连起来            
        m->next=n_1;
        return Dummy->next ;

    }

    ListNode* reverse(ListNode* head){//头插法翻转     
        ListNode* p=nullptr;
        ListNode* q=nullptr;
        p=head->next;
        head->next=nullptr;        
        while(p!=nullptr){
            q=p->next;
            p->next=head->next;
            head->next=p;
            p=q;
        }
        return head;
     }

猜你喜欢

转载自blog.csdn.net/qq_39328436/article/details/114301814