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 }


浙公网安备 33010602011771号