C++中链表反转2

引言

周期按我也写过类似链表反转的文章,这个链表反转是在第二次写的时候写的,由于都是靠当时的思路,两个在代码实现上有所差异,仅以记录。

示例

编程环境

在vs2010下编写的C++控制台输出程序,只改动了main.cpp,其它默认生成。

代码实现

下面是main.cpp中的代码实现。

// testReverseList2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

/************************************************************************/
/* 功能:
stuList *reverseList(stuList *ph)              将链表反转,返回指向反转后的链表
stuList * createList(vector<int> &nVec)        创建链表,返回创建的链表
void outPut(vector<int> &vec)                  输出动态数组中的元素
void fromControlGetNum(vector<int> &nVec)      控制台输入数值,存入到动态数组中,直到输入回车键停止输入
void outPutList(stuList *ph)                   输出链表中结点的值*/
/************************************************************************/

struct stuList{
    int data;
    stuList *pNext;
};

stuList * createList(vector<int> &nVec){
   int nSize = nVec.size();
   int i = 0;
   stuList *ph,*pPre,*pCur;
   while (i < nSize)
   {
       pCur = new stuList;
       if (pCur)
       {
           pCur->data = nVec[i];
           pCur->pNext = nullptr;
           if(i == 0){
               ph = pCur;
               pPre = pCur;
           }else{
               pPre->pNext = pCur;
               pPre = pCur;
           }
           ++i;
       }
   }
   return ph;
}

stuList *reverseList(stuList *ph){
    stuList *pCur,*pPre,*pFont;
    int i= 0;
    pPre = ph;
    pCur = ph->pNext;

    if(pCur->pNext != nullptr){//3个或者3个以上结点
        pFont = pCur->pNext;
        while (pFont != nullptr)
        {
            if(i == 0){
                pPre->pNext = nullptr;
            }
            pCur->pNext = pPre;
            pPre = pCur;
            pCur = pFont;
            if (pFont->pNext != nullptr)
            {
                pFont = pFont->pNext;
            } 
            else
            {
                pCur->pNext = pPre;
                break;
            }
            ++i;
        }
    }else{//只有2个结点
        pPre->pNext = nullptr;
        pCur->pNext = pPre;
    }

    return pCur;
}


void outPut(vector<int> &vec){
    for (int i = 0; i < vec.size(); ++i)
    {
        cout<<vec[i]<<"\t";
    }
    cout<<endl;
}

void fromControlGetNum(vector<int> &nVec){
    int num;
    cout<<"请输入创建链表的值:"<<endl;
    do 
    {
        cin>>num;
        nVec.push_back(num);
    } while (cin.get() != '\n');//当输入回车的时候,停止输入,但是前一个为空格再回车就不能结束输入
}

void outPutList(stuList *ph){
    while (ph != nullptr)
    {
        cout<<ph->data<<"\t";
        ph = ph->pNext;
    }
    cout<<endl;
}


int _tmain(int argc, _TCHAR* argv[])
{
    vector<int> nVec;
    fromControlGetNum(nVec);
    cout<<"输入的数组输出如下:"<<endl;
    outPut(nVec);
    stuList * phList = createList(nVec);
    cout<<"链表输出如下:"<<endl;
    outPutList(phList);
    stuList *pReList = reverseList(phList);
    cout<<"链表反转后输出如下:"<<endl;
    outPutList(pReList);

    system("pause");

	return 0;
}

运行结果

创建2个结点的链表输出结果:
C++中链表反转2
输入3个或者多于3个结点的链表的输出结果:
C++中链表反转2

上一篇:Stata两种方法进行cox回归外部验证(1)


下一篇:角度转弧度的函数