面试题5:从尾到头打印链表

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

我们知道链表的特性,查找其中某一个结点的时间复杂度是O(n),不像数组那样可以直接通过下表在O(1)的时间内查找到指定元素。因此如果要查找链表元素,我们必须从头结点开始顺序往后查找。现在需要输出链表中的每个结点的值,而必须是从尾到头的,也就是先遍历的结点后输出,一个典型的“先进后出”的数据结构,这就让我们想到了栈的结构,如果我们在遍历链表的时候,将遍历的结果存放在一个栈中,遍历结束以后输出栈中的元素值,就是我们需要的从尾到头打印链表结点值。

下面给出代码实例,在代码实例中还包括了创建单链表结点的方法CreateListNode(),往链表尾部添加结点的方法AddToTail(),以及逆序输出链表结点值的方法PrintListInReversedOrder()。这里又注意到既然想到用栈来实现,那么也可以用递归的方法来实现,递归的本质就是一个栈结构,所以逆序输出链表值有两种实现方式。

View Code
#include<iostream>
#include<stdlib.h>
#include<stack>
using namespace std;

//链表结构
struct ListNode
{
    int m_nValue;
    ListNode* m_pNext;
};

//创建一个链表结点
ListNode* CreateListNode(int value)
{
    ListNode *pNode=new ListNode();
    pNode->m_nValue=value;
    pNode->m_pNext=NULL;
    return pNode;

}

void PrintListNode(ListNode* pNode)
{

}

//遍历链表中的所有结点
void PrintList(ListNode* pHead)
{
    ListNode *pNode=pHead;
    while(pNode!=NULL)
    {
        cout<<pNode->m_nValue<<" ";
        pNode=pNode->m_pNext;
    }
    cout<<endl;
}

//往链表末尾添加结点
/*
注意这里pHead是一个指向指针的指针,在主函数中一般传递的是引用。
因为如果要为链表添加结点,那么就会修改链表结构,所以必须传递引用才能够保存修改后的结构。
*/
void AddToTail(ListNode** pHead,int value)
{
    ListNode* pNew=new ListNode();//新插入的结点
    pNew->m_nValue=value;
    pNew->m_pNext=NULL;

    if(*pHead==NULL)//空链表
    {
        *pHead=pNew;
    }
    else
    {
        ListNode* pNode=*pHead;
        while(pNode->m_pNext!=NULL)
            pNode=pNode->m_pNext;
        pNode->m_pNext=pNew;
    }

}


void PrintListInReversedOrderStack(ListNode *pHead)//使用栈
{
    ListNode* pNode=pHead;
    stack<ListNode*> nodes;
    while(pNode!=NULL)
    {
        nodes.push(pNode);
        pNode=pNode->m_pNext;
    }

    while(!nodes.empty())
    {
        pNode=nodes.top();
        cout<<pNode->m_nValue<<" ";
        nodes.pop();
    }
    cout<<endl;

}

void PrintListInReversedOrderRecursion(ListNode *pHead)//使用递归
{
    ListNode* pNode=pHead;
    if(pNode!=NULL)//判断当前结点是否为空
    {
        if(pNode->m_pNext!=NULL)//判断下一个结点是否为空,如果不为空则递归调用
            PrintListInReversedOrderRecursion(pNode->m_pNext);
    }
    cout<<pNode->m_nValue<<" ";
}

void main()
{

    ListNode* pNode1=CreateListNode(1);//创建一个结点
    PrintList(pNode1);//打印

    AddToTail(&pNode1,2);//为链表添加一个结点
    AddToTail(&pNode1,3);//为链表添加一个结点
    AddToTail(&pNode1,4);//为链表添加一个结点
    AddToTail(&pNode1,5);//为链表添加一个结点
    AddToTail(&pNode1,6);//为链表添加一个结点
    AddToTail(&pNode1,7);//为链表添加一个结点
    PrintList(pNode1);//打印

    PrintListInReversedOrderStack(pNode1);
    PrintListInReversedOrderRecursion(pNode1);

    system("pause");

}

 输出结果:

1
1 2 3 4 5 6 7
7 6 5 4 3 2 1
7 6 5 4 3 2 1

posted @ 2012-04-26 20:05  xwdreamer  阅读(3191)  评论(0编辑  收藏  举报