题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值
思路:
1,栈,根据面试官需要是否要改变链表结构
2,递归,原理用到栈
3,可以改变链表结构,就把链头变链尾,改变指针方向
#include<iostream>
#include<stack>
using namespace std;
struct listnode
{
int date;
listnode *next;
};
void creatlist(int arr[],int length,listnode *&listhead)
{
if(arr==NULL||length<0)
return;
listhead=(listnode *)malloc(sizeof(listnode));
listhead->date=arr[0];
listhead->next=NULL;
listnode *p=listhead;
for(int i=1;i<length;i++)
{
listnode *q=(listnode *)malloc(sizeof(listnode));
q->date=arr[i];
q->next=p->next;
p->next=q;
p=q;
}
}
void printlist(listnode *listhead)
{
while(listhead!=NULL)
{
cout<<listhead->date<<" ";
listhead=listhead->next;
}
cout<<endl;
}
void reverselist(listnode *&listhead)
{
if(listhead==NULL)
return;
listnode *rear=listhead,*front=listhead->next;
rear->next=NULL;
while(front!=NULL)
{
listnode *p=front;
front=front->next;
p->next=rear;
rear=p;
}
if(rear->next!=NULL)
listhead=rear;
}
void reverstack(listnode *listhead)
{
std::stack<listnode *> lstack;
listnode *head=listhead;
while(head!=NULL)
{
lstack.push(head);
head=head->next;
}
while(!lstack.empty())
{
cout<<lstack.top()->date<<" ";
lstack.pop();
}
cout<<endl;
}
void reverre(listnode *listhead)
{
if(listhead==NULL)
return;
else
{
reverre(listhead->next);
cout<<listhead->date<<" ";
}
}
void main()
{
int arr[10]={0,1,2,3,4,5,6,7,8,9};
listnode *listhead=NULL;
creatlist(arr,sizeof(arr)/sizeof(int),listhead);
//reverselist(listhead);
//printlist(listhead);
//reverstack(listhead);
reverre(listhead);
}