您好,登錄后才能下訂單哦!
一般這樣的題,鏈表肯定不會是一個雙向鏈表還帶個循環什么的,也就是只給一個單鏈表的頭結點,然后從尾到頭輸出每個結點的值;
如果從前往后去找最后一個結點,那找到了輸出然后就沒辦法往返回往頭部訪問了,因為只是個單鏈表;因此可以想到,用遞歸來實現:
#include <iostream> using namespace std; template <class T> //將鏈表的結點定義為模板類,實現代碼的復用性 struct ListNode { T _data; ListNode<T>* _next; }; template <class T> ListNode<T>* buy_node(T data) //創建結點 { ListNode<T>* tmp = new ListNode<T>; tmp->_data = data; tmp->_next = NULL; return tmp; } template <class T> void init_list(ListNode<T>** node, T data) //鏈表的初始化 { *node = buy_node(data); } template <class T> void push_node(ListNode<T>*& head, T data) //向鏈表中插入結點 { if(head == NULL) { init_list(&head, data); return; } ListNode<T>* tmp = head; while(tmp->_next != NULL) { tmp = tmp->_next; } tmp->_next = buy_node(data); } template <class T> void destroy_list(ListNode<T>*& head) //銷毀鏈表 { if(head != NULL) { ListNode<T>* cur = head; ListNode<T>* tmp = head; while(cur != NULL) { tmp = cur; cur = cur->_next; delete tmp; } head = NULL; } } template <class T> void print_list(ListNode<T>* head) //正序打印鏈表的數據 { while(head != NULL) { cout<<head->_data<<"->"; head = head->_next; } cout<<"NULL"<<endl; } template <class T> void ReversePrintList(ListNode<T>* head) //逆序打印鏈表,用遞歸 { if(head != NULL) { ReversePrintList(head->_next); cout<<head->_data<<"->"; } else cout<<"NULL->"; } int main() { ListNode<int>* list = NULL; push_node(list, 1); push_node(list, 2); push_node(list, 3); push_node(list, 4); push_node(list, 5); push_node(list, 6); push_node(list, 7); push_node(list, 8); push_node(list, 9); cout<<"print list: "; print_list(list); cout<<"reverse print list: "; ReversePrintList(list); cout<<endl; destroy_list(list); return 0; }
上面的栗子中只為了完成題目要求并沒有實現鏈表的其他操作,比如pop數據以及查找刪除插入等函數,運行程序可得如下結果:
從上面的程序可以知道,將鏈表逆序輸出其實就是后插入的結點先輸出,最開始放進去的結點最后輸出,因此也就是后進先出的原則,可以用棧來實現,從頭開始遍歷鏈表,將結點一一push_back進棧里面,然后再從棧頂取出數據,取到的就是鏈表的最后一個結點,再不斷地pop數據然后取棧頂;
上面的程序中用的是非類的變量,下面可以定義一個鏈表類來實現,而且當程序運行完后不用手動調用析構函數釋放空間:
#include <iostream> #include <vector> using namespace std; template <class T> struct ListNode //鏈表結點結構體 { T _data; ListNode<T>* _next; ListNode(T data) :_data(data) ,_next(NULL) {} }; template <class T> class List //實現一個鏈表類 { public: List() //默認構造函數 :_head(NULL) {} List(T data) //帶參的構造函數 :_head(new ListNode<T>(data)) {} ~List() //析構函數,釋放鏈表結點空間 { if(_head != NULL) { ListNode<T>* tmp = _head; ListNode<T>* cur = _head; while(cur != NULL) { tmp = cur; cur = cur->_next; delete tmp; } _head = NULL; } } void _push(T data) //在鏈表尾部push數據 { if(_head == NULL) { _head = new ListNode<T>(data); return; } ListNode<T>* tmp = _head; while(tmp->_next != NULL) tmp = tmp->_next; tmp->_next = new ListNode<T>(data); } void print_list() //正序輸出鏈表 { ListNode<T>* tmp = _head; while(tmp != NULL) { cout<<tmp->_data<<"->"; tmp = tmp->_next; } cout<<"NULL"<<endl; } void ReversePrintList() //逆序輸出鏈表 { vector<T> list; ListNode<T>* tmp = _head; while(tmp != NULL) //將鏈表結點依次放入棧中 { list.push_back(tmp->_data); tmp = tmp->_next; } cout<<"reverse print list:"<<endl; while(!list.empty()) //不斷地取棧頂元素,釋放棧頂元素 { cout<<list.back()<<"->"; list.pop_back(); } cout<<"NULL"<<endl; } private: ListNode<T>* _head; }; int main() { List<int> list(1); list._push(2); list._push(3); list._push(4); list._push(5); list._push(6); list._push(7); list._push(8); list._push(9); list.print_list(); list.ReversePrintList(); return 0; }
運行程序可得如下結果:
《完》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。