剑指offer刷题笔记六:从尾到头打印链表(正式题解)

注:链表的实现见上一篇文章链接: 剑指offer刷题笔记六:从尾到头打印链表(前导文章之一文搞懂C++单向链表).

  • 题目:输入一个链表的头节点,反过来打印出每个结点的值。
  • 分析:一共采取三种方法。
    1、将链表中的结点指针反转过来,即改变链表的方向。此种方法比较容易想到,但是会遇到改变原来链表结构的问题。
    2、用栈实现先进后出的顺序,每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始输出每个结点的值,此时输出的结点的顺序已经反转过来。
    3、利用递归来实现,递归本质上也是一个栈结构。
  • 代码:
    链表的实现见文章开头链接所指向的文章。以下展示反向输出的代码。
#include <iostream>
#include"ListNode.h"
#include<stack>//利用栈是需要包含的头文件

void method1(ListNode* pNode1, ListNode* pNode2, ListNode* pNode3) {//方法一:改变链表结构
    ConnectListNodes(pNode3, pNode2);
    ConnectListNodes(pNode2, pNode1);

    pNode1->m_pNext = nullptr;

    PrintList(pNode3);
}

void method2(ListNode* pHead) {//方法二:利用栈结构
    std::stack<ListNode*>nodes;
    ListNode* pNode = pHead;
    while (pNode != nullptr) {
        nodes.push(pNode);
        pNode = pNode->m_pNext;
    }

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

void method3(ListNode* pHead) {//利用递归
    if (pHead != nullptr) {
        if (pHead->m_pNext != nullptr) {
            method3(pHead->m_pNext);
        }
        std::cout << pHead->m_nValue << "\t";
    }
}
int main()
{
    std::cout << "Test begins!\n";
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode3 = CreateListNode(3);

    ConnectListNodes(pNode1, pNode2);
    ConnectListNodes(pNode2, pNode3);

    //PrintList(pNode1);//从前往后打印链表
    //method1(pNode1, pNode2, pNode3);//使用方法1
    //method2(pNode1);//使用方法2
    method3(pNode1);//使用方法3

    DestroyList(pNode1);
    
    std::cout << "\nTest ends!\n";
}
  • 运行结果:
    从前往后打印链表:
    在这里插入图片描述
    方法一结果:
    在这里插入图片描述
    方法二结果:
    在这里插入图片描述
    方法三结果:
    在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cherries Man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值