【PAT A1074】リンクリストを反転させます

定数K及び単独でリンクされたリストLを与え、あなたは、例えばL.上のすべてのK要素のリンクを、逆になっていることL所与1→2→6→3→4→5、K = 3の場合は、その後マスト出力3→2→1→6→5→4。K = 4の場合は、出力4→3→2→1→→6 5必要があります。

入力仕様:
各入力ファイルは、1つのテストケースが含まれています。各場合について、最初の行が反転するサブリストの長さである第一のノードのアドレス、ノードの総数である正N(≤10^ 5)、及び正K(≤N)が含まれ。ノードのアドレスは、5桁の非負整数であり、NULLは-1で表されます。

N行が続くその後、それぞれの形式におけるノードを記述する。

Address Data Next

アドレスは、ノードの位置である場合、データは、整数であり、次に、次のノードの位置です。

出力仕様は:
各ケースについて、出力結果として生じるが、リンクされたリストを命じました。各ノードは、回線を占有し、そして入力と同じ形式で印刷されます。

アイデアや例
私の愚かなアイデアのは、ちょうどおなじみのチェーンオペレーションの下で、ノートは非常に詳細にする必要があり、リストをシミュレートすることです。ここでは主にサンプルを与えることを、私を見ていない場合は、私の見本帳に生きることができるので、あなたは、この本の最初のサンプルを試すことができますが、間違った答えがあります。私は、コードを入れていないだろう、一つの場所をひっくり返す事を完了するために、逆関数のヘッダファイルアルゴリズムを使用し、オンラインよりインテリジェントなアプローチは、ベクトルまたは配列内部にノードリストの順番に従って、ある参照してください、と。

11111 5 4
11111 1 22222
22222 3 33333
33333 4 -1
44444 5 55555
55555 2 11111

コード

#include <cstdio>
using namespace std;

struct Node{
	int data, Next;
}Nodes[100010];

int main(){
	int start, N, K;
	scanf("%d%d%d", &start, &N, &K);
	for(int i = 0; i < N; i++){
		int address;
		scanf("%d", &address);
		scanf("%d", &Nodes[address].data);
		scanf("%d", &Nodes[address].Next);
	}

	//cnt记录已经完成操作的节点个数,K个为一组,以为倍数
	//begin为组的开始下标
	//last是上一组的第一个元素
	int cnt = 0, begin = start, end = start, last;
	//还有没有完成操作的组
	while(true){
		//iterator用来遍历链表,before用来记录原序列中当前节点的前一个节点
		int iterator = begin, before = begin;
		//找这一组的最后一个节点
		end = begin;
		for(int i = 0; i < K - 1 && end != -1; i++)
			end = Nodes[end].Next;
		//如果end是-1说明这一组个数不足K,此时不调整顺序
		if(end == -1)
			break;
		//上一组最后一个节点连接这一组调整后的第一个节点
		//从第二组开始
		if(cnt > 0)
			Nodes[last].Next = end;
		last = begin;//记录这一组调整后的最后一个元素
		//第一组的最后一个元素为整个链的首节点
		if(cnt == 0)
			start = end;
		//修改begin为下一组第一个节点
		begin = Nodes[end].Next;
		for(int i = 0; i < K; i++){
			int tmp = Nodes[iterator].Next;//用来保存修改next之前的next
			if(i != 0)
				Nodes[iterator].Next = before;
			before = iterator;
			iterator = tmp;
		}
		cnt += K;
	}
	//防止最后一组不用调整,此时上一组的最后节点接该组第一个节点(未调整)
	if(cnt > 0)
		Nodes[last].Next = begin;

	for(int i = 0; i < N && start != -1; i++){
		if(i < N - 1 && Nodes[start].Next != -1)
			printf("%05d %d %05d\n", start, Nodes[start].data, Nodes[start].Next);
		else
			printf("%05d %d -1\n", start, Nodes[start].data);
		start = Nodes[start].Next;
	}

	return 0;
}
公開された30元の記事 ウォンの賞賛1 ビュー10000 +

おすすめ

転載: blog.csdn.net/lvmy3/article/details/104215579