Offer5 从尾到头打印链表

来源:互联网 发布:sql dateadd 编辑:程序博客网 时间:2024/04/29 16:30

题目:

输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

分析:

这个题刚拿过来的时候开始的是想如果是从头到尾输出就好了,这样直接遍历每个结点输出了。要是从尾到头的话可以把链表中的元素增加一项指针,使其后面的结点指向前面的,编程双向链表,这样从头开始遍历,当遍历到最后一个元素的时候再反过头来从尾遍历到头。可是如果不能修改输入的链表怎么办呢?那就得重新想思路了。
从尾到头的输出链表的结点,并且只能从头结点开始访问,也就是说最先访问的最后输出。这样理解是不是就是先进后出,没错,就是栈。把结点依次放入栈中,如果出栈的时候打印出来。

解法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();
    }
}

解法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);
    }
}
0 0
原创粉丝点击