pta乙级1025 反转链表(AC)(检测点6有坑)

 

这道题犹豫了很久,一直没做,今天终于做完了。


思路:

1.将数字存入origin。

2.首先先把题目给的数组按照正确的顺序排好,放入final。

3.按要求反转链表。

#include<bits/stdc++.h>
using namespace std;
typedef struct{
	int address;
	int data;
	int next;
}node;
node origin[100001],final[100001];
int main()
{
	int addr,n,k;
	cin>>addr>>n>>k;
	for(int i=1;i<=n;i++) //输入origin中的元素 
	{
		node temp;
		cin>>temp.address>>temp.data>>temp.next;
		
		origin[temp.address]=temp;
	}
	for(int i=1;i<=n;i++) //将origin中的元素按顺序排至final中 
	{
		final[i]=origin[addr];
		addr=final[i].next;
		if(final[i].next==-1)
		{
			break;
		}
	}
	for(int i=1;i<=n/k;i++) //反转链表 
	{
		for(int j=1;j<=k/2;j++)
		{
			node temp;
			temp=final[i*k-j+1];
			final[i*k-j+1]=final[(i-1)*k+j];
			final[(i-1)*k+j]=temp;
		}
	}
	for (int i=1;i<=n;i++) //输出 
	{
        if(i!=n) 
		{
            final[i].next=final[i+1].address;
            printf("%05d %d %05d\n",final[i].address,final[i].data,final[i].next);
        } 
		else 
		{
            final[i].next=-1;
            printf("%05d %d %d",final[i].address,final[i].data,final[i].next);
        }
    } 
}

 

 检测点6有坑!!!

可能存在无法连接进去的结点,它没说每个节点都是有效的。


在第26行加入n=i,统计有效节点的个数。

#include<bits/stdc++.h>
using namespace std;
typedef struct{
	int address;
	int data;
	int next;
}node;
node origin[100001],final[100001];
int main()
{
	int addr,n,k;
	cin>>addr>>n>>k;
	for(int i=1;i<=n;i++) //输入origin中的元素 
	{
		node temp;
		cin>>temp.address>>temp.data>>temp.next;
		
		origin[temp.address]=temp;
	}
	for(int i=1;i<=n;i++) //将origin中的元素按顺序排至final中 
	{
		final[i]=origin[addr];
		addr=final[i].next;
		if(final[i].next==-1)
		{
			n=i;
			break;
		}
	}
	for(int i=1;i<=n/k;i++) //反转链表 
	{
		for(int j=1;j<=k/2;j++)
		{
			node temp;
			temp=final[i*k-j+1];
			final[i*k-j+1]=final[(i-1)*k+j];
			final[(i-1)*k+j]=temp;
		}
	}
	for (int i=1;i<=n;i++) //输出 
	{
        if(i!=n) 
		{
            final[i].next=final[i+1].address;
            printf("%05d %d %05d\n",final[i].address,final[i].data,final[i].next);
        } 
		else 
		{
            final[i].next=-1;
            printf("%05d %d %d",final[i].address,final[i].data,final[i].next);
        }
    } 
}

终于好了,做了一个多小时。。。。。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值