单链表逆置
题目:输入一个单向链表,将该单链表逆置。
举例:原来链表为1->2->3->4->5翻转为5->4->3->2->1
链表结点定义如下:
struct ListNode { int m_nKey; ListNode* m_pNext; };
答:
#include "stdafx.h" #include <iostream> #include <fstream> using namespace std; struct ListNode { int m_nKey; ListNode* m_pNext; }; //构造链表 void CreateList(ListNode *&pHead) { fstream fin("list.txt"); ListNode *pNode = NULL; ListNode *pTmp = NULL; int data; fin>>data; while (data) { pNode = new ListNode; pNode->m_nKey = data; pNode->m_pNext = NULL; if (NULL == pHead) { pHead = pNode; pTmp = pNode; } else { pTmp->m_pNext = pNode; pTmp = pNode; } fin>>data; } } //翻转单链表 void ReverseLink(ListNode *&pHead) { if (NULL == pHead) { return; } ListNode *pNode = pHead; ListNode *Prev = NULL; ListNode *pNext = NULL; while (NULL != pNode) { pNext = pNode->m_pNext; if (NULL == pNext) { pHead = pNode; } pNode->m_pNext = Prev; Prev = pNode; pNode = pNext; } } void PrintList(ListNode *pHead) { if (NULL == pHead) { return; } ListNode *pNode = pHead; while (NULL != pNode) { cout<<pNode->m_nKey<<" "; pNode = pNode->m_pNext; } cout<<endl; } int _tmain(int argc, _TCHAR* argv[]) { ListNode *pHead = NULL; cout<<"原来的链表:"; CreateList(pHead); PrintList(pHead); ReverseLink(pHead); cout<<"翻转的链表:"; PrintList(pHead); return 0; }
运行界面如下:
建造链表的list.txt文件如下:
12 11 10 9 8 7 6 5 4 3 2 1 0