PAT 1133 Splitting A Linked List (25 分)
题目链接
- 大致题意
- 思路
- AC代码
1.大致题意
给定一个链表,把所有结点权值为负数的放在前面;
所有权值在[0,k]之间的结点要放在权值大于k的结点之前。
2.思路:
step 1: 把所有权值为负数的结点先放入v1,每放入一个结点,标记该结点已经被选取
step 2:以同样方式放入权值在[0,k]之间的结点,并标记该结点已经被选取
step 3:放入剩下的结点(vis[i]==false)
3.AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node
{
int add,data,next;
}a[maxn];
bool vis[maxn]={false};
//当前结点是否已经被选取
int main()
{
#ifdef ONLINE_JUDGE
#else
{
freopen("2.txt","r",stdin);
}
#endif
int first,n,k;
//首结点,结点数量,k
cin>>first>>n>>k;
for(int i=0;i<n;i++)
{
int x1,x2,x3;
cin>>x1>>x2>>x3;
a[x1].add=x1;
a[x1].data=x2;
a[x1].next=x3;//建立链表
}
vector<int>v1;
for(int i=first;i!=-1;i=a[i].next)
//把所有权值为负数的结点先放入v1,每放入一个结点,标记该结点已经被选取
{
if(vis[i]==false)
{
if(a[i].data<0) {v1.push_back(i);vis[i]=true;}
}
}
//把所有权值在[0,k]之间的结点放入v1,每放入一个结点,标记该结点已经被选取
for(int i=first;i!=-1;i=a[i].next)
{
if(vis[i]==false)
{
if(a[i].data>=0&&a[i].data<=k) {v1.push_back(i);vis[i]=true;}
}
}
//放入剩下的结点
for(int i=first;i!=-1;i=a[i].next)
{
if(vis[i]==false)
{
v1.push_back(i);vis[i]=true;
}
}
//注意输出格式
for(int i=0;i<v1.size();i++)
{
int t=v1[i];
printf("%05d %d ",a[t].add,a[t].data);
if(i!=v1.size()-1) printf("%05d\n",a[v1[i+1]].add);
else printf("-1");
}
return 0;
}
喵~