1074 Reversing Linked List (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

分为两块 链表处理 和 结果处理
链表处理通过order顺序链接起来 通过对order排序还可以一并处理掉无效节点
结果处理好麻烦
主要是处理next
先考虑是不是最后一块
不是 就要考虑不是最后一个节点 和是最后一个节点
是 就要考虑是不是完整的最后一块
是的话直接输出 -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