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