題目描述
輸入應該連結清單的頭節點 , 從尾到頭反過來列印出每個節點的值。連結清單定義如下 :
1 typedef struct ListNode
2 {
3 int m_nKey ;
4 ListNode * m_pNext ;
5 }ListNode;
分析:
可能有人的第一反應是将連結清單中的節點指針翻轉過來。但是改變原有的連結清單結構可能在某些情況下不被允許。
列印是一個隻讀操作,首先周遊一遍連結清單,但要做到逆序列印,可以用棧将節點裡面的值存起來。然後将棧push至空。
連結清單逆序列印代碼 :
1 void PrintListNode(ListNode *pHead){
2 stack<int> sk ;
3 while(pHead !=NULL){
4 sk.push(pHead->m_nKey);
5 pHead = pHead->m_pNext ;
6 }
7 // 列印
8 while(!sk.empty()){
9 cout << sk.top()<<endl ;
10 sk.pop();
11 }
12 }
完整代碼 :
此處連結清單 listNode 為舉例 執行個體化 為了 0->1->2->3->4->5->6->7->8->9->10->null ;
1 #include<iostream>
2 #include<malloc.h>
3 #include<stack>
4
5 using namespace std ;
6
7 #define N 10
8
9 typedef struct ListNode
10 {
11 int m_nKey ;
12 ListNode * m_pNext ;
13 }ListNode;
14
15 void PrintListNode(ListNode *pHead){
16 stack<int> sk ;
17 while(pHead !=NULL){
18 sk.push(pHead->m_nKey);
19 pHead = pHead->m_pNext ;
20 }
21 // 列印
22 while(!sk.empty()){
23 cout << sk.top()<<endl ;
24 sk.pop();
25 }
26 }
27 int main(){
28 ListNode *pHead = (ListNode*)malloc(sizeof(ListNode*)) ;
29 ListNode *listNode = (ListNode*)malloc(sizeof(ListNode*)) ;
30 listNode->m_nKey = 0 ;
31 pHead = listNode ;
32 for(int i=0;i<N;i++){
33 ListNode *pNew = (ListNode*)malloc(sizeof(ListNode*)) ;
34 pNew->m_nKey = i+1 ;
35 listNode->m_pNext = pNew ;
36 listNode = listNode->m_pNext ;
37 }
38 listNode->m_pNext = NULL ;
39 PrintListNode(pHead);
40 return 0 ;
41 }
列印結果:
10
9
8
7
6
5
4
3
2
1
0
Process returned 0 (0x0) execution time : 0.189 s
Press any key to continue.
此題除了使用棧,還可以使用遞歸。
代碼差别隻在PrintListNode函數。
1 #include<iostream>
2 #include<malloc.h>
3 #include<stack>
4
5 using namespace std ;
6
7 #define N 10
8
9 typedef struct ListNode
10 {
11 int m_nKey ;
12 ListNode * m_pNext ;
13 }ListNode;
14
15 void PrintListNode(ListNode *pHead){
16 if(pHead->m_pNext!=NULL){
17 PrintListNode(pHead->m_pNext);
18 }
19 cout << pHead->m_nKey << endl;
20 }
21 int main(){
22 ListNode *pHead = (ListNode*)malloc(sizeof(ListNode*)) ;
23 ListNode *listNode = (ListNode*)malloc(sizeof(ListNode*)) ;
24 listNode->m_nKey = 0 ;
25 pHead = listNode ;
26 for(int i=0;i<N;i++){
27 ListNode *pNew = (ListNode*)malloc(sizeof(ListNode*)) ;
28 pNew->m_nKey = i+1 ;
29 listNode->m_pNext = pNew ;
30 listNode = listNode->m_pNext ;
31 }
32 listNode->m_pNext = NULL ;
33 PrintListNode(pHead);
34 return 0 ;
35 }