从尾到头打印链表:输入一个链表的头节点,从尾到头反过来打印每个节点的值。
下面介绍三种方法来实现此题目
①直接改变指针的方向,这种方法一般不提倡,它改变了链表的结构
②既然是从尾到头打印,我们很容易就可以想到栈,栈的结构是“后进先出”
我们可以先遍历一遍链表,如果当前节点不为空,就让其入栈,用栈先将当前遍历的值保存起来,知道遍历到链表的最后一个节点为空之后,再将栈中保存的值输出。
首先先定义一个链表结构
struct ListNode //定义链表结构
{
int data;
ListNode* pNext;
}Node;
函数的实现如下:
void PrintHeadtoTail(ListNode* pHead)
{
std::stack<ListNode*> s;//定义一个栈来存储链表的节点
ListNode* pNode = pHead;
while (pNode) //当链表不为空时,将链表节点入栈
{
s.push(pNode);
pNode = pNode->pNext;
} //出了循环,链表遍历完成
while (!s.empty()) //打印栈中的数据
{
pNode = s.top();
printf("%d\t", pHead->data);
s.pop();
}
}
③用递归的方法来实现(有可能栈)溢出
void PrintHeadtoTail(ListNode* pHead)
{
if (pHead != NULL)
{
if (pHead->pNext != NULL)
{
PrintHeadtoTail(pHead->pNext);
}
}
printf("%d\t", pHead->data);
}