PAT 1025 B倒立リスト

件名の説明:

定数K及び単独リンクリストLを与えられ、L Kを書き込むプログラムは、各反転ノード。たとえば、次のLが与えられる1→2→3→4→5→6、K 3は、出力がなければならない3→2→1→6→5→4; Kが4である場合、出力があるべき4→3 →2→1→5→6、及び最後少ないKの要素以外は反転しません。

入力フォーマット:

各入力は、テストを含みます。各テストケースは、サブヒンジ点の反転を必要とするノードのアドレスの最初の行、N整数ノード陽性の総数(≤10^ 5)、及びK(≤N)整数陽性を与えられます番号。ノード5のアドレスは非負の整数である、NULLアドレスが-1で表されます。
次いで、N行、フォーマットの各列があります。

住所データの

ノードアドレスがアドレスであり、データはノードの整数データに格納され、次に、次のノードのアドレスです。

出力フォーマット:

各テストケースの後にリストをリンクされ、出力順序を逆に、同一ライン上の各ノードは、入力フォーマットを占めました。

サンプル入力:

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 68237 5
68237 6 -1

分析:

Nのサイズを格納する配列を使用し、静的なリストを見るために、タイトルの読み取りを開始、処理ビット面倒。その後、私は非常に簡単にそれらに対処するために、配列の添字に対処直接行う100 000の配列サイズを開くことができると思いました。
ノートには、いくつかの可能な中間点であるがあります。

  1. 5桁のアドレスに必要な出力形式の整数、0を入力する必要があります。
  2. 最後に、ロールオーバー領域は、kの場合、再度反転する必要がある; kは1未満である場合、元の配列は、直接的であってもよいです。
  3. 各ノードの次の値は、リストリバースポジションの後、次のノードの最初のアドレスの出力は、操作を保存することができる、追加の処理を行ってもよいです。一方、最後のノードは、次の出力は-1覚えています。
  4. 第六テストポイントは、調査は他の人が行った後、(私は確かに見つけることができない、あまりにも難しい、遼のドライ)無駄なデータであるデータへの冗長が、時の初期のnに応じて出力があるました出力の大きさ。最後に、有用なデータを書き留めるためのmycountをすることができます。

コード:

#include <cstdio>

struct node{
    int add;
    int num;
    int next;
};

int main()
{
    int firstAdd, n, k;             //初始三个参数
    scanf("%d %d %d", &firstAdd, &n, &k);
    struct node mydata[100000], result[n], mystack[k];
    int i, j = 0, add, p = 0;
    int mycount = 0;
    for(i = 0; i < n; i++){
        scanf("%d", &add);
        scanf("%d %d", &mydata[add].num, &mydata[add].next);
        mydata[add].add = add;
    }
    i = firstAdd;
    while(i != -1){
        if(j == k){
            //出栈,j置0
            for(j--; j >= 0; j--)
                result[p++] = mystack[j];
            j = 0;
        }
        else{
            //入栈
            mycount++;
            mystack[j++] = mydata[i];
            i = mydata[i].next;
        }
    }
    //最后一个链表块的处理
    if(j == k){         //需要翻转
        for(j--; j >= 0; j--)
            result[p++] = mystack[j];
    }
    else{               //不需要翻转
        int temp = j;
        for(j = 0; j < temp; j++)
            result[p++] = mystack[j];
    }
    //输出
    for(i = 0; i < mycount; i++){
        if(i != mycount - 1)
            printf("%05d %d %05d\n", result[i].add, result[i].num, result[i + 1].add);
        else
            printf("%05d %d -1\n", result[i].add, result[i].num);
    }
    return 0;
}

公開された10元の記事 ウォンの賞賛0 ビュー116

おすすめ

転載: blog.csdn.net/qq_41421484/article/details/103991937