標籤:des style blog color 使用 問題
鏈表節點定義如下:
1 typedef struct ListNode2 {3 int value;4 ListNode *next;5 }TListNode;
眾所周知,鏈表列印時從頭到尾很簡單,所以我們首先想到的可能是先把鏈表逆序,然後從頭到尾再列印出來即可,但是逆序會破壞鏈表的結構,對於列印操作來說僅僅是讀操作而已,如果破壞了鏈表結構似乎不和常理,哪麼我們是否有更好的解決辦法呢?答案是肯定的。
我們知道要解決該問題肯定需要遍曆鏈表,而第一個遍曆的節點需要最後一個列印出來,而最後一個遍曆的節點需要最先被列印出來,這是一個很典型的“後入先出”,我們能很迅速的想到用棧來解決該問題,我們只需要在遍曆時依次將結點壓入棧中,再從棧頂依次輸出每個結點的值即達到目的。這種思路實現代碼如下:
1 void PrintListReversing(TListNode *head) 2 { 3 stack<TListNode*> nodes; 4 5 TListNode *pnode = head; 6 while (NULL != pnode) 7 { 8 nodes.push(pnode); 9 10 pnode = pnode->next;11 }12 13 while (!nodes.empty())14 {15 pnode = nodes.top();16 17 cout << pnode->value << endl;18 19 nodes.pop();20 }21 }
既然想到用棧來實現,而遞迴本身就是一個棧結構,因而不難想出用遞迴的方式來實現,實現代碼如下所示:
1 void PrintListReversing2(TListNode *head) 2 { 3 if (NULL != head) 4 { 5 if (NULL != head->next) 6 { 7 PrintListReversing2(head->next); 8 } 9 10 cout << head->value << endl;11 }12 }
上面的實現代碼非常簡潔,但是如果鏈表中結點數很多,可能會導致函數棧溢出,因此實際編碼中應該避免使用。