この質問では、配列を開いてアドレスを保存し、元のリンクリストを3回トラバースできます。最初はすべての負のノードのアドレスを検索し、2回目は間隔値が[0、k]のすべてのノードを検索します。 ]、およびkより大きいすべてのノードを見つける3回目も、保存されたすべてのアドレスが元の内部順序で配置されていることを確認できます。
#include <cstdio>
struct Node{
int ad;
int data;
int next;
}node[100010];
int main(){
int head, n, k;
scanf("%d %d %d", &head, &n, &k);
for(int i=0; i<n; i++){
int ad;
scanf("%d", &ad);
node[ad].ad = ad;
scanf("%d %d", &node[ad].data, &node[ad].next);
}
int arr[n];
int num = 0;
int h = head;
while(h != -1){
if(node[h].data < 0){
arr[num++] = h;
}
h = node[h].next;
}
h = head;
while(h != -1){
if(node[h].data>=0 && node[h].data<=k){
arr[num++] = h;
}
h = node[h].next;
}
h = head;
while(h != -1){
if(node[h].data > k){
arr[num++] = h;
}
h = node[h].next;
}
for(int i=0; i<num-1; i++){
printf("%05d %d %05d\n", arr[i], node[arr[i]].data, arr[i+1]);
}
printf("%05d %d -1", arr[num-1], node[arr[num-1]].data);
return 0;
}