• vivo 部分链表反转


    方法一:使用栈交换需要反转的数字

    #include <iostream>
    #include <stack>
    #include "list.h"
    using namespace std;
    
    void partreverse(ListNode* phead, int m, int n)
    {
    	int count = 1;
    	ListNode* p = phead;
    	stack<ListNode*> s1;
    	if (m < 1 || n < 1)
    		return;
    	if (m > n)
    	{//保证m小于n
    		int temp = m;
    		m = n;
    		n = temp;
    	}
    	if (m == n)//两者相等不交换直接返回
    	  return;
    	while (count < m && p != nullptr)
    	{
    		count++;
    		p = p->m_pNext;
    	}
    	ListNode* start = p;
    	int estart = m + (n - m) / 2 + 1;
    	while (count <n  && p != nullptr)
    	{
    		count++;
    		p = p->m_pNext;
    		if (count >= estart)
    		{
    			if (p != nullptr)
    				s1.push(p);//后半部分进栈
    			else
    				return;//超出长度直接返回
    		}
    	}
    	while (!s1.empty())
    	{//依次交换
    		ListNode* cur = s1.top();
    		int temp = cur->m_nValue;
    		cur->m_nValue = start->m_nValue;
    		start->m_nValue = temp;
    		s1.pop();
    		start = start->m_pNext;
    	}
    	return;
    }
    
    void Test1()
    {
    	ListNode* pNode1 = CreateListNode(1);
    	ListNode* pNode2 = CreateListNode(2);
    	ListNode* pNode3 = CreateListNode(3);
    	ListNode* pNode4 = CreateListNode(4);
    	ListNode* pNode5 = CreateListNode(5);
    
    	ConnectListNodes(pNode1, pNode2);
    	ConnectListNodes(pNode2, pNode3);
    	ConnectListNodes(pNode3, pNode4);
    	ConnectListNodes(pNode4, pNode5);
    	
    	PrintList(pNode1);
    	partreverse(pNode1, 2, 4);
    	PrintList(pNode1);
    }
    
    int main(int argc, char* argv[])
    {
    	Test1();
    	return 0;
    }

    方法二:直接反转需要反转的部分

    #include <iostream>
    #include "list.h"
    using namespace std;
    
    void partreverse(ListNode* phead, int m, int n)
    {
        int count = 1;
        ListNode* p = phead;
        if (m < 1 || n < 1)
            return;
        if (m > n)
        {//保证m小于n
            int temp = m;
            m = n;
            n = temp;
        }
      if (m == n)//两者相等不交换直接返回
            return;
        while (count < m-1 && p != nullptr)
        {
            count++;
            p = p->m_pNext;
        }
        ListNode* prev = p, *start = phead, *end = nullptr, *next = nullptr;
        if (m == 1)
            prev = nullptr;
        if (prev != nullptr)
            start = prev->m_pNext;
        p = start;
        for (count = m; count < n && p != nullptr;)
        {
            count++;
            p = p->m_pNext;
        }
        end = p;
        if (end != nullptr)
            next = end->m_pNext;
        else
            return;//end为nullptr,超出链表长度
        if(prev !=nullptr)
            prev->m_pNext = end;//prev指向反转后的链表头
        end->m_pNext = nullptr;
        ListNode* rprve = start, *rcur = start->m_pNext, *rnext = rcur->m_pNext;
        while (rcur != end) 
        {//指定范围内的链表反转
            rcur->m_pNext = rprve;
            rprve = rcur;
            rcur = rnext;
            if (rnext != nullptr)
                rnext = rnext->m_pNext;
        }
        rcur->m_pNext = rprve;
        start->m_pNext = next;
        if (prev == nullptr)
            phead = end;//链表头被反转
        PrintList(phead);
        return;
    
    }
    
    void Test1()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode2 = CreateListNode(2);
        ListNode* pNode3 = CreateListNode(3);
        ListNode* pNode4 = CreateListNode(4);
        ListNode* pNode5 = CreateListNode(5);
    
        ConnectListNodes(pNode1, pNode2);
        ConnectListNodes(pNode2, pNode3);
        ConnectListNodes(pNode3, pNode4);
        ConnectListNodes(pNode4, pNode5);
        
        PrintList(pNode1);
        partreverse(pNode1, 1, 5);
        //PrintList(pNode1);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        return 0;
    }

    前面花太多时间导致后面的送分题01背包没时间做,我恨!

  • 相关阅读:
    小程序裁剪图片上传头像,二维码源码
    算法随笔
    背景色根据数值由深到浅
    jquery 点击弹框
    css3
    HTML5中手势原理分析与数学知识的实践
    es6(var,let,const,set,map,Array.from())
    taro3.0 Swiper album example
    taro3.x: 搭建redux环境
    taro: fial cannot navigate back at first page
  • 原文地址:https://www.cnblogs.com/ccxikka/p/10976784.html
Copyright © 2020-2023  润新知