AcWing 1. 链表
原题链接
简单
作者:
Mamba_Chu
,
2021-04-19 00:22:09
,
所有人可见
,
阅读 312
C++ 代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
struct Node{
int data, addres; //需要用到自己下标的时候定义自己的下标
int next;
bool flag;
}node[N];
bool cmp(Node a, Node b)
{
if(a.flag == false || b.flag == false) return a.flag > b.flag; //将链表总无用的节点放到后面去 剩下的1 ~ count为有用的节点
else return a.data < b.data;
}
int main()
{
int n, idx, data, addres, next, count = 0;
cin >> n >> idx;
for(int i = 0; i < N; i ++) node[i].flag = false; //切记 将需要维护的额外信息赋初值
for(int i = 0; i < n; i ++)
{
cin >> addres >> data >> next;
node[addres].addres = addres;
node[addres].data = data;
node[addres].next = next;
}
for(int i = idx; i != -1; i = node[i].next)
{
count ++; //计数 为了在排序之后知道链表的个数
node[i].flag = true;
}
if(count == 0) cout << 0 << " " << -1 << endl;
sort(node, node + N, cmp);
printf("%d %05d\n", count, node[0].addres);
for(int i = 0; i < count; i ++)
{
if(i != count - 1) //特判 最后不能有空格
{
printf("%05d %d %05d\n", node[i].addres, node[i].data, node[i + 1].addres); //遍历当前的和后面的元素
}
else
printf("%05d %d -1", node[i].addres, node[i].data);
}
return 0;
}