笔试面试24——链表04反转链表:
题目分析:设置三个指针,一个指向节点,一个指向前,一个指向下一个。为了防止反转后,下一节点和链表断开。
反转后,把前指针和节点指针向后移一个。
#include<iostream>
using namespace std;
struct ListNode{
int data;
ListNode* pNext;
};
//创建链表
void CreatList(ListNode* &pHead,int data)
{
ListNode* pNewNode = new ListNode();//新建存放数据的节点
pNewNode->pNext = NULL;
pNewNode->data = data;
if(NULL == pHead)
{
pHead = pNewNode;
}
else
{
ListNode* pNode = pHead;//新建遍历节点
while(pNode->pNext != NULL)
pNode = pNode->pNext;
pNode->pNext = pNewNode;
}
}
ListNode* ReverseList(ListNode *pHead)
{
ListNode* pAhead = NULL;//定义前节点
ListNode* pNode = pHead;//定义节点
ListNode* pReHead = NULL;//定义反转后的头结点
while(pNode != NULL)//如果节点不为空
{
ListNode* pNext = pNode->pNext;//定义后节点保存信息,防止反转后,后边的断开
if(pNext == NULL)//是最后一个节点
pReHead = pNode;
pNode->pNext = pAhead;//反转,节点指向前节点
pAhead = pNode;//指针移动,前节点移到节点
pNode = pNext;//指针移动遍历,节点指向下一个节点
}
return pReHead;
}
void PrintList(ListNode* &pHead)
{
if(pHead == NULL)
cout << "链表为空!"<< endl;
else
{
ListNode* pNode = pHead;
while(pNode != NULL)
{
cout << pNode->data << " ";
pNode = pNode->pNext;
}
}
cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int num = 0;
ListNode* pHead = NULL;
cout << "请输入链表:" << endl;
while(cin >> num)
{
CreatList(pHead,num);
}
cout << "反转前的链表:" << endl;
PrintList(pHead);
cout << "反转后的链表:" << endl;
ListNode* pReversedHead = ReverseList(pHead);
PrintList(pReversedHead);
system("pause");
return 0;
}