引言
周期按我也写过类似链表反转的文章,这个链表反转是在第二次写的时候写的,由于都是靠当时的思路,两个在代码实现上有所差异,仅以记录。
示例
编程环境
在vs2010下编写的C++控制台输出程序,文件名由main.cpp改为testReverseList2.cpp,其它默认生成。
代码实现
下面是testReverseList2.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个结点的链表的输出结果: