PTA 6-5 单链表逆序输出

本题要求实现一个函数,逆序输出不带头结点的单链表的的所有元素值。

函数接口定义:

void Reverse ( LinkList L );

其中LinkList结构定义如下:

L是不带头结点的单链表的头指针,即单链表首元素结点指针。

裁判测试程序样例:

输入样例:

输入是以-1结束的整数序列,-1不属于单链表元素,整数之间空格分隔。

2 1 4 5 3 -1

输出样例:

逆序输出单链表所有元素,格式为每个整数后面跟一个空格。

3 5 4 1 2 

递归:

  1. 如果链表L为空,则直接返回。
  2. 接着,判断链表L的next指针是否为NULL,如果不为NULL,说明还有节点需要输出。
  3. 调用递归函数Reverse,传入L->next节点,实现逆序输出。
  4. 递归调用会一直进行,直到链表的最后一个节点。
  5. 最后,输出当前节点L的数据值。
void Reverse ( LinkList L )
{
    if(L==NULL)
        return;
    if(L->next!=NULL)
        Reverse(L->next);
    printf("%d ",L->data);
}

思路2:

  1. 定义两个指针p和pn,分别指向链表L的头节点和第二个节点。
  2. 进入第一个while循环,循环条件是p不为NULL,即还有节点需要处理。
  3. 在循环中,将pn指向p的下一个节点。
  4. 进入第二个while循环,循环条件是pn不为NULL,即还有节点需要交换数据。
  5. 在循环中,将p节点的data与pn节点的data交换。
  6. 将pn指向pn的下一个节点,即pn向后移动一位。
  7. 循环结束后,输出当前节点p的data值。
  8. 将p指向p的下一个节点,即p向后移动一位。
  9. 重复步骤2到步骤8,直到遍历完整个链表。

使用了两层循环,外层循环用于遍历链表的每一个节点,内层循环用于将当前节点与后面的节点进行数据交换。然后,输出每个节点的data值,实现逆序输出整个链表的数据。

void Reverse ( LinkList L )
{
    LinkList p=L;
    LinkList pn;// 第二个节点
    while(p)
    {
        pn=p;
        pn=pn->next;
        while(pn)
        {
            int temp=p->data;
            p->data=pn->data;
            pn->data=temp;
            pn=pn->next;
        }
        printf("%d ",p->data);
        p=p->next;
    }
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值