1074リンクリストの反転(25分)

ここに画像の説明を挿入

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つに分かれています
リンクリスト処理は順序順にリンクされています。無効なノードは順序を並べ替えて一緒に処理することもできます。
結果は面倒です。
主な理由は
次のブロック
最後のブロックか最後のブロックかを検討することですそうではなく、それは最後のノードではありません。合計が最後のノードである場合、それ
が完全な最後のピースであるかどうかを考慮する必要があり
ます。はいの
場合は直接-1を出力し、そうでない場合は順次出力します。

#include <cstdio>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 100010;

struct Node
{
    
    
	int address;
	int data;
	int next;
	int order;
}node[maxn];
bool cmp(Node a,Node b)
{
    
    
	return a.order < b.order;
}
int main()
{
    
    
	for(int i = 0; i < maxn; i++)
	{
    
    
		node[i].order = maxn;
	}
	int begin,n,k;
	int address,data,next;
	cin >> begin >> n >> k;
	for(int i = 0; i < n; i++)
	{
    
    
		cin >> address >> data >> next;
        node[address].address = address;
        node[address].data = data;
        node[address].next = next;
	}
	int p = begin, count = 0;
	while(p != -1)
	{
    
    
		node[p].order = count++;
		p = node[p].next;
	}
	sort(node,node + maxn,cmp);
	n = count; //有效节点count个
	for(int i = 0; i < n / k; i++) //先处理整块的
	{
    
    
		//第i块倒着输出
		for(int j = (i + 1) * k - 1;j > i * k; j--)
		{
    
    
			printf("%05d %d %05d\n", node[j].address,node[j].data,node[j-1].address);
		}
		printf("%05d %d ",node[i * k].address,node[i*k].data);
		//若果不是最后一块那就指向下一块的最后一个节点
		if(i < n / k - 1) printf("%05d\n",node[(i+2)*k -1].address);
		else //是最后一块 还要考虑是不是完整的
		{
    
    
			if(n %k == 0) printf("-1\n");
			else
			{
    
    
				printf("%05d\n",node[(i+1)*k].address);
				for(int i = n / k * k; i < n; i++)
				{
    
    
					printf("%05d %d ",node[i].address,node[i].data);
					if(i < n-1)
					{
    
    
						printf("%05d\n",node[i+1].address);
					}
					else
					{
    
    
						printf("-1\n");
					}
				}
			}
		}	
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/moumoumouwang/article/details/112507194