从尾到头打印链表

来源:互联网 发布:阿里大数据分析报告 编辑:程序博客网 时间:2024/06/06 04:56

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值

思路:

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);}

0 0
原创粉丝点击