02-线性结构3 Reversing Linked List (25分)

02-线性结构3 Reversing Linked List   (25分)

Given a constant KK and a singly linked list LL, you are supposed to reverse the links of every KK elements on LL. For example, given LL being 1→2→3→4→5→6, if K = 3K=3, then you must output 3→2→1→6→5→4; if K = 4K=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 NN (\le 10^5105) which is the total number of nodes, and a positive KK (\le NN) 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 NN 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 Nextis 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

这题花了一点时间,但是并不难,第一要注意有可能不是所有的节点都要用到,所以有可能最后输出小于给出的节点。后来想到可以用reverse直接做的,然后下个节点的地址也可以不用存储,最后再输出。这个代码很粗糙,下次再来优化。

#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
	int address;
	int key;
	int next;
}a[100005],b[100005],c[100005];
int main()
{
	int ad;
	int m,n;
	cin>>ad>>n>>m;
	for(int i=0;i<n;i++)
	{
		node A;
		cin>>A.address>>A.key>>A.next;
		a[A.address]=A;
	}
	int k=1;
	long temp=ad;
	while(a[temp].next!=-1)
	{
		b[k++].address=temp;
		b[k-1].key=a[temp].key;
		b[k-1].next=a[temp].next;
		temp=a[temp].next;
	}
	b[k].address=a[temp].address;
	b[k].key=a[temp].key;
	b[k].next=-1;
	int t=0;
	int i;
	for(i=1;i*m<=k;i++)
	{
		for(int j=i*m;j>(i-1)*m;j--)
		{
			c[t++].address=b[j].address;
			c[t-1].key=b[j].key;
		}
	}
	for(int j=(i-1)*m+1;j<=k;j++)
	{
		c[t++].address=b[j].address;
		c[t-1].key=b[j].key;
	}  
	for(int q=0;q<k-1;q++)
	{
		c[q].next=c[q+1].address;
	}
	c[k-1].next=-1;
	for(int q=0;q<k-1;q++)
	{
		printf("%05ld %d %05ld\n",c[q].address,c[q].key,c[q].next);
	}
	printf("%05ld %d %d\n",c[k-1].address,c[k-1].key,-1);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没想好叫什么名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值