链表的逆向输出
方法一:定义新数组
定义新的数组存放链表的值,将数组逆置后输出。这种方法很简单,但是浪费空间,相较而言不支持使用。
核心代码:
void printreverse(Elensn* head)
{
Elensn *p;
int among,a[N],i,j;
for(p=head,i=0;p!=NULL;p=p->next,i++)
{
a[i]=p->data;//将链表中节点的值赋给新建立的一维数组
}
for(j=0,i=N-1;j<i;j++,i—)//将数组中所有元素逆置
{
among=a[i];
a[i]=a[j];
a[j]=among;
}
for(i=0;i<N;i++)//输出数组
printf("%d",a[i]);
printf("\n");
}
方法二:
定义指针pend初值null,将p指针指向pend的前一个元素,输出p的值后前移pend,再运用空循环将p移至pend的前一个节点,输出后再次前移pend。依次循环。
具体代码:
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct Node
{
int data;
struct Node *next;
}Elensn;
Elensn *initLink(int *a,int n)//创建链表,返回值为头指针
{
int i;
Elensn *h,*tail;
h=tail=(Elensn*)malloc(sizeof(Elensn));//单独定义第一个结点
h->data=a[0];
h->next=NULL;
for(i=1;i<n;i++)//定义其余的结点
{
tail=tail->next=(Elensn*)malloc(sizeof(Elensn));
tail->data=a[i];
tail->next=NULL;
}
return h;
}
void printLink(Elensn* head)//输出链表
{
Elensn* p;
for(p=head;p;p=p->next)//当p指向空时,即链表内无值时跳出循环
printf("%d\t",p->data);
printf("\n");
}
void reverse(Elensn* h)//核心代码
{
Elensn *p,*pend=NULL;
while(pend!=h)//当前面的指针不指向头结点开始循环
{
for(p=h;p->next!=pend;p=p->next);
printf("%d\t",p->data);
pend=p;
}
printf("\n");
}
int main(void)
{
int a[N]={1,2,3,4,5};
Elensn * head;
head=initLink(a,N);
printf("原链表值为:\n");
printLink(head);
printf("链表的逆向输出为:\n");
reverse(head);
return 0;
}
方法三:
和方法二原理相同,但运用了函数嵌套,运用了递归的方法,实现链表的逆置,表达更为简便。
核心代码:
void reverseShow(Elensn* head)
{
if(head != NULL)//链表不为空
{
reverseShow(head->next);//运用递归方法实现逆向输出
printf(“%d\t",head->data);
}
}
方法四:栈实现逆向输出
运用栈的方式进行函数的逆向输出。栈的输出原则为先进后出,故可将元素存在栈内,最终实现逆向输出。
核心代码:
void reverse(Elensn *head)//栈实现元素逆向输出
{
int top=-1,i;//栈底元素设为-1,栈为空时top值为-1
int *s;//定义栈s
Elensn *p=head;
s=(int *)malloc(N*sizeof(int));//为栈s分布内存空间
for(i=0;i<N;i++,p=p->next)//将链表中的值输入到栈中
s[++top]=p->data;
while(top!=-1)//当栈不为空时,对栈进行输出
printf("%d\t",s[top--]);
printf("\n");
}
代码的实现效果: