​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.执行结果

PAT 1133 C++版_#include

6.总结

在整个代码中,需要注意的问题有:


  • set的遍历过程中,需要使用一个​​backIt​​​和 ​​nextIt​​​。因为需要输出下一个节点的​​address​​。
  • 因为set中存放的是自定义的类型node,所以在定义结构体​​node​​​时也需要重载运算符​​<​​。