首页 > 代码库 > 从尾到头打印单链表

从尾到头打印单链表

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

struct ListNode{
    int m_nValue;
    ListNode* m_pNext;
};

分析:考虑栈操作的类似性,可以建立堆栈然后输出。实现代码如下:


void PrintListReversingly_Iteratively(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();
    }
}

既然想到用堆栈,就可以想到递归在本质上也是堆栈结构,于是我们可以用递归来实现。要实现反过来输出链表,我们每访问到一个节点的时候,先递归输出她后面的结点,在输出该节点自身就可以了。实现代码如下:

void PrintListReversingly_Recursively(ListNode* pHead){
    if(pHead!=NULL){
        if(pHead->m_pNext!=NULL){
            PrintListReversingly_Recursingly(pHead->m_pNext);
        }
        printf("%d\t",pHead->m_nValue);
    }
}

递归的方法有个问题:当链表非常长时,就会导致函数调用的层级很深,从而有可能导致函数调用的栈溢出。显式的栈基于循环实现的代码的鲁棒性要好一些。




本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1581618

从尾到头打印单链表