链表
一般如果数据量不太大的情况下,我们可以使用指针作为链表的实现,如果数据量太大的,我们可以使用静态数组的方式来实现链表结构。有没有发现这个和树的建立是类似的
做pat的时候,我们还是尽量使用静态链表来建立,这样的话,可以减少处理的时间——来源于yxc
不多bb,直接上题
本人狗分做法
#include<iostream>
#include<cstdio>
using namespace std;
int l[100001]={0};
int main()
{
cin.tie(0);
//狗分操作,可以拿下10多分,具体思路,反向遍历,如果有两个尾结点的话,没有suffix;如果只有一个尾结点,我们找到第一个分叉即可。可以得到11分
int st1,st2,n;
int flag=1;
int end=0;
int count=0;
int ans;
scanf("%d %d %d",&st1,&st2,&n);
for(int i=0;i<n;i++)
{
char c;
int x,y;
cin>>x>>c>>y;
if(y==-1)
{
count++;
}
if(l[y]==0)
{
l[y]=x;
}
else if(l[y]!=0)
{
if(!end)
ans=y;
}
}
if(count==1)
cout<<ans;
else
cout<<"-1";
return 0;
}
狗分的漏洞,我个人感觉在于可能是一个链表是另一个链表的子集。
参考别人的题解
#include<iostream>
#include<cstdio>
using namespace std;
const int N=99999;
struct node{
bool flag;
int next;
}num[N];
int main()
{
cin.tie(0);
int s1,s2,n;
int x,y;
char c;
cin>>s1>>s2>>n;
for(int i=0;i<n;i++)
{
scanf("%d %c %d",&x,&c,&y);
num[x].next=y;
num[x].flag=false;
}
for(int i=s1;i!=-1;i=num[i].next)
{
num[i].flag=true;
}
for(int i=s2;i!=-1;i=num[i].next)
{
if(num[i].flag==true)
{
printf("%05d",i);
return 0;
}
}
printf("-1");
return 0;
}
分析:
静态数组的话,设置大小我们一般来说都是题目给定大小设置的,然后通过设置相关的值进行操作。
- 为了可以更直白的表示数据的情况,我们可以next[x]=y;即x的下一个指针为y值,然后不断迭代,进行实现。
- 如果是指针的话,我们一般是要对null进行判断,然后生成相关属性。
- 该题中不存链表相同后裂开的情况,所以可以简化。并且字符没有作用。
- 冲就完事