引言
周期按我也写过类似链表反转的文章,这个链表反转是在第二次写的时候写的,由于都是靠当时的思路,两个在代码实现上有所差异,仅以记录。
示例
编程环境
在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个结点的链表输出结果:
输入3个或者多于3个结点的链表的输出结果: