一、题目概述
对给定单链表进行结点洗牌,使负值结点在前、不大于K的正值结点在中、大于K的结点在后,且保持三部分内部相对顺序不变。
二、思路
遍历单链表,按值将结点分配至三个结点数组,然后输出三个数组。
注意考虑可能有数组为空。
三、代码
#include <cstdio>
#include <vector>
using namespace std;
struct node
{
int data, addr, next;
};
int main()
{
int head, N, K;
vector<node> a(100000), ans[3];
scanf("%d %d %d", &head, &N, &K);
for( int i = 0; i < N; ++i )
{
node temp;
scanf("%d %d %d", &temp.addr, &temp.data, &temp.next);
a[ temp.addr ] = temp;
}
for( int i = head; i != -1; i = a[i].next )
if( a[i].data < 0 )
ans[0].push_back( a[i] );
else if( a[i].data <= K )
ans[1].push_back( a[i] );
else ans[2].push_back( a[i] );
for( int i = 0, cnt = 0; i < 3; ++i )
for( int j = 0; j < ans[i].size(); ++j, ++cnt )
if( !cnt )
printf("%05d %d ", ans[i][j].addr, ans[i][j].data);
else printf("%05d\n%05d %d ", ans[i][j].addr, ans[i][j].addr, ans[i][j].data);
printf("-1");
}