1133 Splitting A Linked List

 这是一道模板题,要先记住大体流程然后反复练习。

 flag作为标记,可以根据其值的大小,把结点划分成4种类型。

 

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int maxn = 100010;
 6 struct Node { //第一步,定义静态链表
 7     int data;
 8     int address,next;
 9     int flag = 2*maxn; //第二步,初始化标记
10 } node[maxn];
11 
12 bool cmp(const Node& a,const Node& b) {
13     return a.flag < b.flag;
14 }
15 int main() {
16     int begin,n,k,address;
17     cin>>begin>>n>>k;
18     for(int i = 0; i < n; ++i) {
19         scanf("%d",&address);
20         node[address].address = address;
21         scanf("%d%d",&node[address].data,&node[address].next);
22     }
23     //第三步,遍历静态链表,统计有效结点个数,并标记结点
24     int p = begin,cnt = 0;
25     while(p != -1) {
26         if(node[p].data < 0) node[p].flag = cnt++ - maxn;
27         else if(node[p].data > k) node[p].flag = maxn + cnt++;
28         else node[p].flag = cnt++;
29         p = node[p].next;
30     }
31     sort(node,node+maxn,cmp);
32     for(int i = 0; i < cnt; ++i) {
33         if(i < cnt -1) printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);
34         else printf("%05d %d -1\n",node[i].address,node[i].data);
35     }
36     return 0;
37 }

 

posted @ 2020-03-16 15:39  tangq123  阅读(109)  评论(0)    收藏  举报