从尾到头打印链表
问题:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
NO1:
看见这个问题我们的第一反应就是将这个单链表反转一下,这样我们就可以将这个链表从尾到头的打印了。具体的链表的反转,我们可以参考https://blog.csdn.net/weixin_42078660/article/details/96148956。
NO2:
这时候我们想要的是从尾到头打印这个链表,就可以用到栈这种存储结构,栈是一种可以实现“先进后出”的一种存储结构。我们可以将链表的所有元素压入栈中,然后在将栈里面的所有的元素依次打印出来,这样我们就实现了将链表中的元素从尾到头的打印。
部分代码如下:
struct ListNode
{
int m_nKey;
LinstNode* m_pNext;
}
void PrintListReversingly_Iteratively(ListNode * pHead)
{
ListNode *pNode = pHead;
while(pNode!=nullptr)
{
nodes.push(pNode);
pNode=pNode->m_pNext;
}
while (!nodes.empty())
{
pNode = nodes.top();
printf("%d\t",pNode->m_nKey);
nodes.pop();
}
}
NO3:
我们可以考虑递归的办法,首先我们找到链表的尾部,然后依次的打印,返回上一次情况。
部分代码如下:
struct ListNode
{
int m_nKey;
LinstNode* m_pNext;
}
void PrintListReversingly_Recursively(ListNode * pHead)
{
if(pHead != nullptr)
{
if(pHead->m_pNext!=nullptr)
{
PrintListReversingly_Recursively(pHead->m_pNext);
}
printf("%d\t",pHead->m_nKey);
}
}
比较:
对于第一种方法,我们改变了链表的结构,这个我们需要了解清楚是否可以改变链表的结构。
对于第二种方法,我们使用了栈这种存储结构。
对于第三种方法,我们使用了递归,但是我们需要注意,当链表非常长的时候,有可能导致函数调用栈溢出。
这三种方法我们可以根据题目的要求,具体的选择某种方式。