一般這樣的題,鏈表肯定不會是一個雙向鏈表還帶個循環(huán)什么的,也就是只給一個單鏈表的頭結(jié)點,然后從尾到頭輸出每個結(jié)點的值;
創(chuàng)新互聯(lián)公司專注于東陽網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供東陽營銷型網(wǎng)站建設(shè),東陽網(wǎng)站制作、東陽網(wǎng)頁設(shè)計、東陽網(wǎng)站官網(wǎng)定制、小程序設(shè)計服務(wù),打造東陽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供東陽網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
如果從前往后去找最后一個結(jié)點,那找到了輸出然后就沒辦法往返回往頭部訪問了,因為只是個單鏈表;因此可以想到,用遞歸來實現(xiàn):
#includeusing namespace std; template //將鏈表的結(jié)點定義為模板類,實現(xiàn)代碼的復(fù)用性 struct ListNode { T _data; ListNode * _next; }; template ListNode * buy_node(T data) //創(chuàng)建結(jié)點 { ListNode * tmp = new ListNode ; tmp->_data = data; tmp->_next = NULL; return tmp; } template void init_list(ListNode ** node, T data) //鏈表的初始化 { *node = buy_node(data); } template void push_node(ListNode *& head, T data) //向鏈表中插入結(jié)點 { if(head == NULL) { init_list(&head, data); return; } ListNode * tmp = head; while(tmp->_next != NULL) { tmp = tmp->_next; } tmp->_next = buy_node(data); } template void destroy_list(ListNode *& head) //銷毀鏈表 { if(head != NULL) { ListNode * cur = head; ListNode * tmp = head; while(cur != NULL) { tmp = cur; cur = cur->_next; delete tmp; } head = NULL; } } template void print_list(ListNode * head) //正序打印鏈表的數(shù)據(jù) { while(head != NULL) { cout< _data<<"->"; head = head->_next; } cout<<"NULL"< void ReversePrintList(ListNode * head) //逆序打印鏈表,用遞歸 { if(head != NULL) { ReversePrintList(head->_next); cout< _data<<"->"; } else cout<<"NULL->"; } int main() { ListNode * 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< 上面的栗子中只為了完成題目要求并沒有實現(xiàn)鏈表的其他操作,比如pop數(shù)據(jù)以及查找刪除插入等函數(shù),運行程序可得如下結(jié)果:
從上面的程序可以知道,將鏈表逆序輸出其實就是后插入的結(jié)點先輸出,最開始放進去的結(jié)點最后輸出,因此也就是后進先出的原則,可以用棧來實現(xiàn),從頭開始遍歷鏈表,將結(jié)點一一push_back進棧里面,然后再從棧頂取出數(shù)據(jù),取到的就是鏈表的最后一個結(jié)點,再不斷地pop數(shù)據(jù)然后取棧頂;
上面的程序中用的是非類的變量,下面可以定義一個鏈表類來實現(xiàn),而且當(dāng)程序運行完后不用手動調(diào)用析構(gòu)函數(shù)釋放空間:
#include#include using namespace std; template struct ListNode //鏈表結(jié)點結(jié)構(gòu)體 { T _data; ListNode * _next; ListNode(T data) :_data(data) ,_next(NULL) {} }; template class List //實現(xiàn)一個鏈表類 { public: List() //默認構(gòu)造函數(shù) :_head(NULL) {} List(T data) //帶參的構(gòu)造函數(shù) :_head(new ListNode (data)) {} ~List() //析構(gòu)函數(shù),釋放鏈表結(jié)點空間 { if(_head != NULL) { ListNode * tmp = _head; ListNode * cur = _head; while(cur != NULL) { tmp = cur; cur = cur->_next; delete tmp; } _head = NULL; } } void _push(T data) //在鏈表尾部push數(shù)據(jù) { if(_head == NULL) { _head = new ListNode (data); return; } ListNode * tmp = _head; while(tmp->_next != NULL) tmp = tmp->_next; tmp->_next = new ListNode (data); } void print_list() //正序輸出鏈表 { ListNode * tmp = _head; while(tmp != NULL) { cout< _data<<"->"; tmp = tmp->_next; } cout<<"NULL"< list; ListNode * tmp = _head; while(tmp != NULL) //將鏈表結(jié)點依次放入棧中 { list.push_back(tmp->_data); tmp = tmp->_next; } cout<<"reverse print list:"< "; list.pop_back(); } cout<<"NULL"< * _head; }; int main() { List 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; } 運行程序可得如下結(jié)果:
《完》
網(wǎng)頁題目:輸入一個鏈表的頭結(jié)點,從尾到頭反過來打印每個結(jié)點的值——5
鏈接地址:http://weahome.cn/article/gdchpp.html