题目描述:
输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
解题思路:
方法一:借用栈倒序输出链表
因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈。
方法二:借用递归输出链表
通过分析题目,可以看出是先遍历的放在ArrayList最下边,和栈的原理相似,所以可以借助栈来实现。递归也是基于堆栈的,因此可考虑用递归实现。在已知当前的节点引用,总是考虑先输出下一个节点的值。
代码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<stack>
using namespace std;
struct node
{
int date;
struct node *next;
};
void create(node **Head,int date)
{
node *p=new node();
p->date=date;
if(!(*Head))
{
*Head=p;
}
else
{
p->next=(*Head);
(*Head)=p;
}
}
void print(node *head)
{
while(head)
{
cout<<head->date<<" ";
head=head->next;
}
cout<<endl;
}
/* 方法1: 利用栈实现 */
void reverseOutput1(node* head)
{
node* p=head;
stack<int> s;
while(p!=NULL)
{
s.push(p->date);
p=p->next;
}
while(!s.empty())
{
printf("%d ",s.top());
s.pop();
}
printf("\n");
}
/* 方法2: 递归调用 */
void reverseOutput3(node* head)
{
if(!head)
return;
reverseOutput3(head->next);
printf("%d ", head->date);
}
int main() {
node *head=NULL;
create(&head,9);
create(&head,7);
create(&head,5);
create(&head,4);
create(&head,3);
create(&head,2);
create(&head,1);
cout<<"原链表数据:"<<endl;
print(head); //1 2 3 4 5 7 9
cout<<"方法1: 利用栈实现 逆置结果:"<<endl;
reverseOutput1(head);
cout<<"方法2: 递归调用 逆置结果:"<<endl;
reverseOutput3(head);
cout<<endl;
return 0;
}