PAT A 1074. Reversing Linked List (25)

题目

iven a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L.  For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case.  For each case, the first line contains the address of the first node, a positive N (<= 105) which is the total number of nodes, and a positive K (<=N) which is the length of the sublist to be reversed.  The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, and Next is the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list.  Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

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

Sample Output:

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

 

按每K个元素反转链,

这里的内存限制很宽,可以通过id来模拟地址,不需要真的去构建链

 

代码:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

struct node	//点结构,包括点的地址和值
{
	int adress;
	int value;
};

int main()
{
	int first,n,k;	//首地址,数量,反转数k
	cin>>first>>n>>k;

	int *data=new int [100000];	//存相应地址的值
	int *next=new int [100000];	//存相应地址的下个地址
	
	vector<node> list,temp;	//存反转后的链,用于反转的临时链
	node tnode;	//临时点

	int i;
	int adress;
	for(i=0;i<n;i++)	//输入数据
	{
		scanf("%d",&adress);
		scanf("%d %d",&data[adress],&next[adress]);
	}

	adress=first;	//adress指向每k个数的第一个
	while(1)
	{
		temp.clear();
		for(i=0;i<k;i++)	//扫描k个数,压入临时结构,到尾部跳出
		{
			if(adress==-1)
				break;
			else
			{
				tnode.adress=adress;
				tnode.value=data[adress];
				temp.push_back(tnode);
				adress=next[adress];
			}
		}
		if(i<k)	//不满k个,直接转移
		{
			for(i=0;i<temp.size();i++)
				list.push_back(temp[i]);
			break;
		}
		else	//满k个,反转转移
			for(i=k-1;i>=0;i--)
				list.push_back(temp[i]);
	}

	for(i=0;i<list.size();i++)	//输出
	{
		printf("%05d %d ",list[i].adress,list[i].value);
		if(i+1<list.size())
			printf("%05d\n",list[i+1].adress);
		else
			printf("-1\n");
	}

	delete [] data;
	delete [] next;

	return 0;
}


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值