链表的逆向输出(多种方法实现)

链表的逆向输出

方法一:定义新数组
定义新的数组存放链表的值,将数组逆置后输出。这种方法很简单,但是浪费空间,相较而言不支持使用。

核心代码:
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");
}

代码的实现效果:
在这里插入图片描述

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值