数据结构与算法-从尾到头打印链表

剑指offer上经典的题目:输入一个链表的头结点,然后从尾到头打印每个节点的值

思路1:链表的遍历只能从头到尾,而这里需要实现从尾到头打印,可见这是典型的“先进后出”,所以我们可以采用栈这种数据类型来实现。
链表节点的定义:

#include <iostream>
#include <stack>
using namespace std;
struct Node{
    int val;
    Node* next;
    Node(int x):val(x),next(NULL){}
};
class ListNode
{
private:
    Node *head;
public:
    ListNode(Node *node)
    {
        head=node;
    }
    void printlist(Node *head);
    int getsize(Node *head);
    void add(int index,int element,Node *&head);
    bool iscontains(int element,Node *head);
    void remove(int index,Node *&head);
    Node* ReverseList(Node *head);
    void PrintListReverse1(Node *head);//使用栈来实现
};

实现的函数:

void ListNode::PrintListReverse1(Node *head)
{
    stack<Node*> nodes;//使用栈来存放节点
    Node *temp=head;
    while(temp!= nullptr)
    {
        nodes.push(temp);//遍历每个节点,并进栈
        temp=temp->next;
    }
    while(!nodes.empty())
    {
        temp=nodes.top();
        cout<<temp->val<<"\t";
        nodes.pop();//先进后出,实现反序打印链表
    }
}

思路2:递归的本质类似于一个栈结构,既然可以使用栈来实现,同理我们可以使用递归的方法来实现反向输出链表。 做法: 每次访问一个节点,我们先递归输出后面的节点,然后再输出自身节点。
实现代码:

void ListNode::PrintLsitRevrse2(Node *head)
{
    Node *temp=head;
    if(temp!= nullptr)
    {
        if(temp->next!= nullptr)
            PrintLsitRevrse2(temp->next);
        //先输出后面的节点 然后再输出当前的节点,递归实现
        cout<<temp->val<<"\t";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值