遍历是从头到尾,然而题目要求是从尾到头打印单链表,所以递归是一个很好的方法,我们每访问到一个结点时。先递归输出它后面的结点,再输出该结点自身。
但是需要注意的是当链表非常长的时候,就会导致函数调用的层级很深,从而导致函数调用栈溢出。
代码实现如下:
#include <stdio.h>
struct ListNode
{
int m_nkey;
ListNode*m_pnext;
};
//创建链表结点
ListNode*createNode(int value)
{
ListNode*pnode=new ListNode();
pnode->m_nkey=value;
pnode->m_pnext=NULL;
return pnode;
}
//链接链表结点
void connection(ListNode*pcurren,ListNode*pnext)
{
if(pcurren==NULL)
{
printf("链接错误");
}
pcurren->m_pnext=pnext;
}
void Nixu(ListNode*phead)
{
if(phead!=NULL)
{
if(phead->m_pnext!=NULL)
{
Nixu(phead->m_pnext);
}
printf("%d ",phead->m_nkey);
}
}
//销毁结点
void destroy(ListNode*phead)
{
ListNode*pnode=phead;
while(pnode!=NULL)
{
phead=phead->m_pnext;
delete pnode;
pnode=phead;
}
}
int main()
{
ListNode*p1=createNode(1);
ListNode*p2=createNode(2);
ListNode*p3=createNode(3);
connection(p1,p2);
connection(p2,p3);
Nixu(p1);
destroy(p1);
return 0;
}