剑指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";
}
}