/*
copyright@nciaebupt 轉載請註明出處
題目:輸入一個鏈表的頭結點,從尾到頭反到來輸出每個結點的值。鏈表結點定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:這是一道很故含義的面試題。該題以及它的變體經常展目前各大公司的面試、筆試題
中。
看到這道題後,第一反響是過去到後輸出比擬容易。於是很慷慨地想到把鏈表中鏈接結點的
指針反轉到來,改換鏈表的方向。然後就能夠過去到後輸出了。反轉鏈表的算法詳見本人面
試題精選系列的第19題,在此不再細述。但該措施必需額外的壟斷,該當還有更好的措施。
接下來的設法是過去到後遍歷鏈表,每穿越一個結點的時候,把該結點放到一個棧中。當遍
歷徹底端鏈表後,再從棧頂開始輸出結點的值,此刻輸出的結點的次序曾經反轉到來了。該
措施必需維護一個額外的棧,告終起來比擬繁瑣。
既然想到了棧來告終這個函數,而遞歸性質上即便一個棧構造。於是很慷慨的又想到了用遞
歸來告終。要告終反到來輸出鏈表,我們每拜會到一個結點的時候,先遞歸輸出它後面的結
點,再輸出該結點切身,這麼鏈表的輸出收穫就反到來了。
*/
#include <cstdlib>
#include <iostream>
struct ListNode{
int m_nKey;
ListNode * m_pNext;
};
ListNode * createList(int * arr, int len, ListNode * head){
if(arr == NULL || len < 1) return NULL;
for(int i = 0; i < len; ++i){
ListNode * newnode = new ListNode;
newnode->m_nKey = arr[i];
newnode->m_pNext = NULL;
if(head == NULL){
head = newnode;
}
else{
newnode->m_pNext = head;
head = newnode;
}
}
return head;
}
void printListNormal(ListNode * head){
if(head == NULL) return;
ListNode * cur = head;
while(cur != NULL){
std::cout<<cur->m_nKey<<" ";
cur = cur->m_pNext;
}
std::cout<<std::endl;
}
void printListReverse(ListNode * head){
if(head == NULL) return;
printListReverse(head->m_pNext);
std::cout<<head->m_nKey<<std::endl;
}
int main(int argc, char ** argv){
int arr[] = {1,2,3,4,5,6,7,8};
int len = sizeof(arr)/sizeof(int);
ListNode * head = NULL;
head = createList(arr, len, head);
printListNormal(head);
printListReverse(head);
system("pause");
return 0;
}
輸入一個鏈表的頭結點,從尾到頭反到來輸出每個結點的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.