题目:
输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
分析:
这个题刚拿过来的时候开始的是想如果是从头到尾输出就好了,这样直接遍历每个结点输出了。要是从尾到头的话可以把链表中的元素增加一项指针,使其后面的结点指向前面的,编程双向链表,这样从头开始遍历,当遍历到最后一个元素的时候再反过头来从尾遍历到头。可是如果不能修改输入的链表怎么办呢?那就得重新想思路了。
从尾到头的输出链表的结点,并且只能从头结点开始访问,也就是说最先访问的最后输出。这样理解是不是就是先进后出,没错,就是栈。把结点依次放入栈中,如果出栈的时候打印出来。
解法1:
得出解题思路来之后那么就开始做吧,可以用STL的类库,做一个stack,然后进栈出栈。
代码:
void printListReversing(ListNode *pHead)
{
std::stack<ListNode*> nodes;
ListNode *pNode = pHead;
while(pNode != NULL)
{
nodes.push(pNode);
pNode = pNode->m_pNext;
}
while(!nodes.empty())
{
pNode = nodes.top();
printf("%d\t",pNode->m_nValue);
nodes.pop();
}
}
{
std::stack<ListNode*> nodes;
ListNode *pNode = pHead;
while(pNode != NULL)
{
nodes.push(pNode);
pNode = pNode->m_pNext;
}
while(!nodes.empty())
{
pNode = nodes.top();
printf("%d\t",pNode->m_nValue);
nodes.pop();
}
}
解法2:
想到栈那么就马上能想到递归函数,用系统给的递归可以让代码少些很多。
代码:
void PrintListReversing_digui(ListNode *pHead)
{
if(pHead != NULL)
{
if(pHead->m_pNext != NULL)
PrintListReversing_digui(pHead->m_pNext);
printf("%d\t",pHead->m_nValue);
}
}
{
if(pHead != NULL)
{
if(pHead->m_pNext != NULL)
PrintListReversing_digui(pHead->m_pNext);
printf("%d\t",pHead->m_nValue);
}
}