牛客网PAT乙级真题 反转链表 (25) (含有大坑)

牛客网PAT乙级真题 反转链表 (25) (含有大坑)

时间限制 2000 ms 内存限制 150400 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为
3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。

输入描述:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 105)、以及正整数K(<=N),即要求反转的
子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。

输出描述:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入例子:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

输出例子:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

解题思路

咋一看,是个简单题。但是题上给的输入,让人着实为难。看完后,忽然想起严奶奶那本书里的静态链表是个好东西,这是思路之一。
本题还可以那样,把这三个变量放到结构体里面,按照链接顺序排列好
赋值进一个数组里面,然后对着数组逆置,然后,输出时候next值就为当前结点的下一个结点的地址值

有坑

本题的坑是小心有的结点没在链表中,所以需要自己统计一下
AC代码如下

#include<stdio.h>
struct node
{
    int data;
    int next;
}sq[200001];        //多1是为了加个链表表头
int main()
{
    for(int i=0;i<200001;i++)sq[i].next=i;      //把各个结点规整好
    int ini,N,K;
    scanf("%d%d%d",&ini,&N,&K);
    for(int i=0,a,b,c;i<N;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        sq[a].data=b;
        sq[a].next=c;
    }               //都安排上了,开整。其他的操作和链式存储差不多啊!
    N=0;
    for(int i=ini;i!=-1;i=sq[i].next)N++;       //这个很重要的!!!因为题中有些结点不在链表内,这是最大的坑了!!!
    int p,pre,coun=1,q;      //cou第几个结点了
    sq[200000].next=ini;
    pre=200000;             //我们的大表头
    while(coun<=N)        //即是还没到链表尾部
    {           //防止有无效的结点存在,影响判断
        if(N-coun+1>=K)     //如果大于K个,逆置。头插法
        {
            p=sq[pre].next;
            q=sq[p].next;
            for(int i=1;i<K;i++)
            {
                sq[p].next=sq[q].next;
                sq[q].next=sq[pre].next;            //头插呀,对吧
                sq[pre].next=q;              //把前面的头接好
                q=sq[p].next;
            }
            pre=p;
        }
        else
            break;
        coun=coun+K;
    }
    int i;     //大功告成,输出biubiu,biubiu(づ ̄3 ̄)づ╭❤~
    for(i=sq[200000].next;sq[i].next!=-1;i=sq[i].next)
        printf("%05d %d %05d\n",i,sq[i].data,sq[i].next);       //严格5位输出
    printf("%05d %d %d\n",i,sq[i].data,-1);      //最后的-1不是5位输出啊!
    return 0;
}
发布了18 篇原创文章 · 获赞 2 · 访问量 227

猜你喜欢

转载自blog.csdn.net/zhou_hao_ran/article/details/103759522
今日推荐