面试题五: 从尾到头打印链表

来源:互联网 发布:淘宝搜索引擎工作流程 编辑:程序博客网 时间:2024/05/17 22:03
/*brief: 输入一个链表的头结点,从尾到头反过来打印出每个结点的数值。*/#include "iostream"using namespace std;//#include "List.h"#include "stack"void PrintListReversingly_Iteratively(ListNode *pHead){std::stack<ListNode*>nodes;ListNode *pNode = pHead;while(pNode != NULL){nodes.push(pNode);pNode = pNode->m_pNext;}while(!nodes.empty()){pNode = nodes.top();printf("%d\t", pNode->m_nValue);nodes.pop();}}void PrintListReversingly_Recursively(ListNode *pHead){if(pHead != NULL){if(pHead->m_pNext != NULL){PrintListReversingly_Recursively(pHead->m_pNext);}printf("%d\t", pHead->m_nValue);}}void Test(ListNode *pHead){ PrintList(pHead); PrintListReversingly_Iteratively(pHead); printf("\n"); PrintListReversingly_Recursively(pHead);}// 1->2->3->4->5void Test1(){printf("\nTest1 begins.\n");//ListNode *pNode1 = CreateListNode(1);ListNode* pNode2 = CreateListNode(2);    ListNode* pNode3 = CreateListNode(3);    ListNode* pNode4 = CreateListNode(4);    ListNode* pNode5 = CreateListNode(5);ConnectListNodes(pNode1, pNode2);    ConnectListNodes(pNode2, pNode3);    ConnectListNodes(pNode3, pNode4);    ConnectListNodes(pNode4, pNode5); Test(pNode1); DestroyList(pNode1);}// 只有一个结点的链表: 1void Test2(){printf("\nTest2.begins.\n");// ListNode* pNode1 = CreateListNode(1); Test(pNode1); DestroyList(pNode1);}// 空链表void Test3(){printf("\nTest3 begins.\n");Test(NULL);}int main(int argc, char * argv[]){Test1(); Test2();  Test3();system("pause");system("pause");return 0;}
List.h
<pre name="code" class="cpp">struct ListNode{intm_nValue;ListNode   *m_pNext;};__declspec( dllexport ) ListNode* CreateListNode(int value); // 将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。__declspec( dllexport ) void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);__declspec( dllexport ) void PrintList(ListNode* pHead);__declspec( dllexport ) void DestroyList(ListNode* pHead);


List.cpp
/**/#include "list.h"#include "stdio.h"<span style="white-space:pre"></span>// NULL//#include "stdlib.h"ListNode *CreateListNode(int value){<span style="white-space:pre"></span>ListNode *pNode = new ListNode;<span style="white-space:pre"></span>pNode->m_nValue = value;<span style="white-space:pre"></span>pNode->m_pNext = NULL;<span style="white-space:pre"></span>//<span style="white-space:pre"></span>return pNode;}void ConnectListNodes(ListNode *pCurrent, ListNode *pNext){<span style="white-space:pre"></span>if(pCurrent == NULL)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>printf("Error to connect two nodes.\n");<span style="white-space:pre"></span>exit(1);// exit(1)表示异常退出.这个1是返回给操作系统的。<span style="white-space:pre"></span>}<span style="white-space:pre"></span>pCurrent->m_pNext = pNext;}void PrintList(ListNode *pHead){<span style="white-space:pre"></span> printf("PrintList starts.\n");<span style="white-space:pre"></span> ListNode *pNode = pHead;<span style="white-space:pre"></span> while(pNode != NULL)<span style="white-space:pre"></span> {<span style="white-space:pre"></span> printf("%d\t", pNode->m_nValue);<span style="white-space:pre"></span> pNode = pNode->m_pNext;<span style="white-space:pre"></span> }<span style="white-space:pre"></span> printf("\nPrintList ends.\n");}void DestroyList(ListNode* pHead){<span style="white-space:pre"></span>ListNode *pNode = pHead;<span style="white-space:pre"></span>while(pNode != NULL)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>pHead = pHead->m_pNext;<span style="white-space:pre"></span>delete pNode;<span style="white-space:pre"></span>pNode = pHead;<span style="white-space:pre"></span>}}


0 0
原创粉丝点击