您的位置:首页 > 职场人生

【笔试面试——24】链表04——反转链表

2014-08-07 14:13 169 查看
笔试面试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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: