2022.1.22 练习 PAT甲 1052 Linked List Sorting (原题链接)
坑点已在代码相应位置添加注释
心得:链表题注意测试点中可能含有无效结点,需要遍历构造链表,排除无效结点,构造出一条有效的链表。
题解如下:
#include<bits/stdc++.h>
using namespace std;
const int MAX_SIZE=1e6+5;
struct Node
{
int address;
int data;
int next;
};
Node node[MAX_SIZE];
bool cmp(Node a,Node b)
{
return a.data<b.data;
}
vector<Node> v;
int main()
{
std::ios::sync_with_stdio(false);
int n,pos0;
cin>>n>>pos0;
for(int i=0;i<n;i++)
{
int tmp0,tmp1,tmp2;
cin>>tmp0>>tmp1>>tmp2;
node[tmp0].address=tmp0;
node[tmp0].data=tmp1;
node[tmp0].next=tmp2;
}
//遍历链表,判断是否含有有效结点,如果有,加入vector容器
for(int i=pos0;i!=-1;i=node[i].next)
{
Node tmp;
tmp.address=node[i].address;
tmp.data=node[i].data;
tmp.next=node[i].next;
v.push_back(tmp);
}
if(v.size()==0)
cout<<0<<" "<<-1;//测试点4 没有有效结点的情况 输出 0 -1
else
{
sort(v.begin(),v.end(),cmp);
vector<Node>::iterator it=v.begin();
cout<<v.size()<<" ";
cout<<setw(5)<<setfill('0')<<(*it).address<<endl;//测试点3 单独输出头节点地址时也要考虑补0!
for(;it !=v.end();it++)
{
cout<<setw(5)<<setfill('0')<<(*it).address<<" ";
cout<<(*it).data<<" ";
if(it<v.end()-1)
cout<<setw(5)<<setfill('0')<<(*(it+1)).address<<endl;
else
cout<<-1<<endl;
}
}
return 0;
}