PATグレードA 1074リバースリンクリスト(25ポイント)| C ++実装

1.タイトルの説明

元のタイトルリンク
ここに画像の説明を挿入

入力仕様:

ここに画像の説明を挿入

出力仕様:

ケースごとに、結果の順序付けされたリンクリストを出力します。各ノードは1行を占め、入力と同じ形式で出力されます。

入力例:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

出力例:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

2、問題解決のアイデア

リンクリスト反転質問は、一般的なリンクリスト質問と同様に、ノードを表す構造を作成します。これには、データとアドレスへのポイントが含まれます。whileループを使用してリンクリストを作成し、アドレスをvector <int> addに格納してから、ループを作成してすべてのK要素をフリップします。つまり、アドレスを再配置し、最後に出力します。この種のリンクリストの質問はもっと行う必要があります。もっと行うと気分が良くなります。

3、ACコード

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100001;
struct Node
{
    
    
    int data, next;
}node[maxn];
int main()
{
    
    
    int first, N, K, tmp;
    vector<int> add;
    scanf("%d%d%d", &first, &N, &K);
    for(int i=0; i<N; i++)
    {
    
    
        scanf("%d", &tmp);
        scanf("%d%d", &node[tmp].data, &node[tmp].next);
    }
    tmp = first;
    while(tmp != -1)
    {
    
    
        add.push_back(tmp);
        tmp = node[tmp].next;
    }
    int sze = add.size();
    for(int i=0; i+K<=sze; i += K)    //有效链表元素数为size
    {
    
    
        reverse(add.begin()+i, add.begin()+i+K);
    }
    for(int j=0; j<sze-1; j++)
    {
    
    
        printf("%05d %d %05d\n", add[j], node[add[j]].data, add[j+1]);
    }
    printf("%05d %d -1\n", add[sze-1], node[add[sze-1]].data);
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_42393947/article/details/108723684