PAT_1025_反转链表
思路&注意事项
1.开三个数组分别存储当前地址、数据、下一个地址。
2.遍历前K+1个,记录所在地址,然后制定其下一个地址。
代码
#include <iostream>
#include <cstdio>
using namespace std;
const int maxsize = 100010;
int main()
{
int address, N, K;
scanf("%d%d%d", &address, &N, &K);
int list_address[maxsize], next[maxsize], data[maxsize]; //list_address所在地址,next存储下一个地址,data存储数据
for(int i = 0; i < N; i++){
scanf("%d", &list_address[i]);
scanf("%d%d", &data[list_address[i]], &next[list_address[i]]);
}
int address_k[K+1];
if(K < N){
address_k[0] = address;
for(int i = 1; i < K+1; i++){//存储前k+1个数的地址
address_k[i] = next[address_k[i-1]];
}
for(int i = K-1; i > 0; i--){
next[address_k[i]] = address_k[i-1];
}
next[address_k[0]] = address_k[K];
}else{//K==N的情况
address_k[0] = address;
for(int i = 1; i < N; i++){
address_k[i] = next[address_k[i-1]];
}
for(int i = N-1; i >= 0; i--){
if(i != N-1){
next[address_k[i+1]] = address_k[i];
}
next[address_k[i]] = address_k[N-1];
}
next[address_k[0]] = -1;
}
int address_temp = address_k[K-1];
for(int i = 0; i < N; i++){
if(next[address_temp] != -1){
printf("%05d %d %05d\n", address_temp, data[address_temp], next[address_temp]);
}else{
printf("%05d %d %d\n", address_temp, data[address_temp], next[address_temp]);
}
address_temp = next[address_temp];
}
return 0;
}