题目:输入一个链表的头结点,从头到尾反过来打印出每个结点的值。关键词:堆
链表结点的定义如下:
struct ListNode{
int m_nkey;
ListNode* m_pNext;
}
思路1:
在面试的时候,我们需要询问一下面试官能不能改变链表的结构,问清楚要求之后再进行作答。这里假设是不改变链表的结构,那么我们需要遍历这个链表再进行输出,注意到倒着打印链表相当于先遍历的结点要后输出,后遍历的结点要先输出。这和栈的逻辑是一样的。所以这道题可以建立一个栈,每访问一个结点就将其入栈,访问链表结束后将栈里面的结点的数据依次进行输出,这样就可以得到倒着打印出的结果。
#include <iostream>
#include<stack>
using namespace std;
struct ListNode {
int m_nKey;
ListNode* m_pNext;
};
void PrintListReversingly_Iteratively(ListNode* pHead)
{
ListNode* pNode = pHead;
stack<ListNode*>nodes;
while (pNode!=NULL)
{
nodes.push(pNode);
pNode = pNode->m_pNext;
}
while (!nodes.empty())
{
pNode = nodes.top();
printf("%d\t", pNode->m_nKey);
nodes.pop();
}
}
思路2:
前面想到了栈的方法来实现这个函数,而递归在本质上就是一个栈结构,于是很自然的想到了用递归来实现。要实现反过来实现输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。
#include <iostream>
#include<stack>
using namespace std;
struct ListNode {
int m_nKey;
ListNode* m_pNext;
};
void PrintListReversingly_Recursively(ListNode* pHead)
{
if (pHead != NULL)
{
if (pHead->m_pNext != NULL)
{
PrintListReversingly_Recursively(pHead->m_pNext);
}
printf("%d\t", pHead->m_nKey);
}
}
复习:
开始想着怎么去建立与前驱节点的联系,想的有点复杂,很多时候STL模板库可以提供很好的解决办法。关键词:堆
二刷代码:
struct ListNode
{
int m_nKey;
ListNode*m_pNext;
};
void PrintListReversingly_Lteratively(ListNode*pHead)
{
stack<ListNode*>nodes;
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();
}
}
void PrintListReversingly_Recursively(ListNode*pHead)
{
if (pHead == nullptr)
return;
if (pHead->m_pNext != nullptr)
{
PrintListReversingly_Recursively(pHead->m_pNext);
}
printf("%d\t", pHead->m_nKey);
}