一般這樣的題,鏈表肯定不會是一個雙向鏈表還帶個循環(huán)什么的,也就是只給一個單鏈表的頭結(jié)點,然后從尾到頭輸出每個結(jié)點的值;

如果從前往后去找最后一個結(jié)點,那找到了輸出然后就沒辦法往返回往頭部訪問了,因為只是個單鏈表;因此可以想到,用遞歸來實現(xiàn):
#include <iostream>
using namespace std;
template <class T> //將鏈表的結(jié)點定義為模板類,實現(xiàn)代碼的復用性
struct ListNode
{
T _data;
ListNode<T>* _next;
};
template <class T>
ListNode<T>* buy_node(T data) //創(chuàng)建結(jié)點
{
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) //向鏈表中插入結(jié)點
{
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) //正序打印鏈表的數(shù)據(jù)
{
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;
}上面的栗子中只為了完成題目要求并沒有實現(xiàn)鏈表的其他操作,比如pop數(shù)據(jù)以及查找刪除插入等函數(shù),運行程序可得如下結(jié)果:

從上面的程序可以知道,將鏈表逆序輸出其實就是后插入的結(jié)點先輸出,最開始放進去的結(jié)點最后輸出,因此也就是后進先出的原則,可以用棧來實現(xiàn),從頭開始遍歷鏈表,將結(jié)點一一push_back進棧里面,然后再從棧頂取出數(shù)據(jù),取到的就是鏈表的最后一個結(jié)點,再不斷地pop數(shù)據(jù)然后取棧頂;
上面的程序中用的是非類的變量,下面可以定義一個鏈表類來實現(xiàn),而且當程序運行完后不用手動調(diào)用析構函數(shù)釋放空間:
#include <iostream>
#include <vector>
using namespace std;
template <class T>
struct ListNode //鏈表結(jié)點結(jié)構體
{
T _data;
ListNode<T>* _next;
ListNode(T data)
:_data(data)
,_next(NULL)
{}
};
template <class T>
class List //實現(xiàn)一個鏈表類
{
public:
List() //默認構造函數(shù)
:_head(NULL)
{}
List(T data) //帶參的構造函數(shù)
:_head(new ListNode<T>(data))
{}
~List() //析構函數(shù),釋放鏈表結(jié)點空間
{
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數(shù)據(jù)
{
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) //將鏈表結(jié)點依次放入棧中
{
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;
}運行程序可得如下結(jié)果:

《完》
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)站標題:輸入一個鏈表的頭結(jié)點,從尾到頭反過來打印每個結(jié)點的值——5-創(chuàng)新互聯(lián)
標題URL:http://chinadenli.net/article38/dijosp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計、網(wǎng)頁設計公司、網(wǎng)站收錄、小程序開發(fā)、企業(yè)網(wǎng)站制作、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容