PAT 1133
C++
版
1.题意
按照题意指定,将一个单链表重组。重组要求如下:
- 节点值为负数的在单链表第一部分
- 节点值在
[0,k]
之间的在单链表的第二部分 - 剩余的在单链表的第三部分
2.分析
使用三个while(root!=-1)
循环依次将结果写入到 set<node>
中,这样就可以保证按照顺序存储。
3.代码
#include<cstdio>
#include<set>
#include<iostream>
using namespace std;
struct node{
int address;
int next = -1;
int data;
int order;
bool operator<(const node &n)const{
return n.order > order;
}
};
node n[100005];
int main(){
int root,N,K;//N是总结点数; K是范围值
scanf("%d %d %d",&root,&N,&K);
int i ,j;
int address;
for(i = 0;i< N ;i++){
scanf("%d",&address);
scanf("%d %d",&n[address].data,&n[address].next);
n[address].address = address;
}
int tempRoot = root;
set<node> res;
node tempNode;
int index = 0;
while(tempRoot!=-1){//=-1表示到头
if(n[tempRoot].data < 0){
tempNode.address = tempRoot;
tempNode.data = n[tempRoot].data;
tempNode.order = index;
index ++;
res.insert(tempNode);//放入set中
}
tempRoot = n[tempRoot].next;
}
tempRoot = root;
while(tempRoot != -1){//放入 值 <= K的元素
if(n[tempRoot].data <= K && n[tempRoot].data >= 0){
tempNode.address = tempRoot;
tempNode.data = n[tempRoot].data;
tempNode.order = index;
index++;
res.insert(tempNode);//放入set中
}
tempRoot = n[tempRoot].next;
}
tempRoot = root;
while(tempRoot != -1){//放入 值 <= K的元素
if(n[tempRoot].data > K){
tempNode.address = tempRoot;
tempNode.data = n[tempRoot].data;
tempNode.order = index;
tempNode.next = -1;
index++;
res.insert(tempNode);//放入set中
}
tempRoot = n[tempRoot].next;
}
set<node>::iterator nextIt;
set<node>::iterator backIt;
for(set<node>::iterator it = res.begin();it!=res.end();it++){
backIt=it;
nextIt=++it;
if(nextIt!=res.end()) printf("%05d %d %05d\n",backIt->address,backIt->data,nextIt->address);
else printf("%05d %d -1\n",backIt->address,backIt->data);
it=backIt;
}
}
4.测试用例
00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218
5.执行结果
6.总结
在整个代码中,需要注意的问题有:
- set的遍历过程中,需要使用一个
backIt
和nextIt
。因为需要输出下一个节点的address
。 - 因为set中存放的是自定义的类型node,所以在定义结构体
node
时也需要重载运算符<
。