这道题其实不太难就是坑比较多,做法依旧是跟上道题的模板一样用结构数组制作一个假链表
struct list
{
int data;
int next;
}node[100001];
然后就是假链表的读入
for(int i=1;i<=num;i++)
{
int add1,data1,add2;cin>>add1>>data1>>add2;
node[add1].data=data1;
node[add1].next=add2;
}
读入之后我们定义一个小数组储存我们的地址
int arr[100001];
int n=0;
int head0=first;
while(head0!=-1)
{
arr[n]=head0;
head0=node[head0].next;
n++;
}
之后我们就会遇到坑就是单复数问题,所以我们要分情况输出,还有就是我们用一个左右指针法输出就可以按题目要求输出了
int left= 0,right=n-1;
while(left<=right&&n%2==0)
{
printf("%05d %d %05d\n",arr[right],node[arr[right]].data,arr[left]);
if((right-1)<(left+1))
printf("%05d %d -1\n",arr[left],node[arr[left]].data);
else
printf("%05d %d %05d\n",arr[left],node[arr[left]].data,arr[right-1]);
right--;left++;
}
while(left<=right&&n%2==1)
{
printf("%05d %d %05d\n",arr[right],node[arr[right]].data,arr[left]);
if((right-2)<(left+2))
{printf("%05d %d %05d\n",arr[left],node[arr[left]].data,arr[right-1]);break;}
else
printf("%05d %d %05d\n",arr[left],node[arr[left]].data,arr[right-1]);
right--;left++;
}
if(n%2==1)printf("%05d %d -1",arr[n/2],node[arr[n/2]].data);
以上就是本题的一大坑点。
接下来就是本题的具体代码了。
#include<bits/stdc++.h>
using namespace std;
struct list
{
int data;
int next;
}node[100001];
int main()
{
int first,num;cin>>first>>num;
for(int i=1;i<=num;i++)
{
int add1,data1,add2;cin>>add1>>data1>>add2;
node[add1].data=data1;
node[add1].next=add2;
}
int arr[100001];
int n=0;
int head0=first;
while(head0!=-1)
{
arr[n]=head0;
head0=node[head0].next;
n++;
}
int left= 0,right=n-1;
while(left<=right&&n%2==0)
{
printf("%05d %d %05d\n",arr[right],node[arr[right]].data,arr[left]);
if((right-1)<(left+1))
printf("%05d %d -1\n",arr[left],node[arr[left]].data);
else
printf("%05d %d %05d\n",arr[left],node[arr[left]].data,arr[right-1]);
right--;left++;
}
while(left<=right&&n%2==1)
{
printf("%05d %d %05d\n",arr[right],node[arr[right]].data,arr[left]);
if((right-2)<(left+2))
{printf("%05d %d %05d\n",arr[left],node[arr[left]].data,arr[right-1]);break;}
else
printf("%05d %d %05d\n",arr[left],node[arr[left]].data,arr[right-1]);
right--;left++;
}
if(n%2==1)printf("%05d %d -1",arr[n/2],node[arr[n/2]].data);
}