02-线性结构3 Reversing Linked List (25 分)(把变量放入数组下标和数组值里面,方便处理)

跪求这题链表的解法,感觉处理起来没有顺序表方便,于是偷懒用了一波结构体数组的解法,其中也涉及了很多的知识点
1.这题还是使用了之前的一个技巧,因为输入的每一组数据包括该节点的地址,data值以及下一组数据节点的地址,变量有三个(其实是两个,有一个是下一个节点的地址值)。所以定义了一个结构体数组,数组下标值为对应节点的地址值,结构体内部的data和next分别代表该节点的data和下一个结点的address,以此来实现延续性。
2.为了简便运算,这题使用了reserve函数
3.同样为了简便运算,使用了c语言输出五位数的方式,c++的setw()和setfill比较麻烦(个人感觉)
代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
const int Maxsize = 1000010;//这个数据很重要,少一位会数据太小不够处理
struct node {              //多一位会堆溢出,出现异常,都导致无法正常调试
	int data;             //当然如果使用maxsize的数组都定义为全局则不受堆溢出影响
	int next;
}a[Maxsize];//为什么这个结构体数组在主函数中定义会抛出异常?
int b[Maxsize];//这里定义不会受到main函数空间影响进而导致堆溢出之类的麻烦
//这题也用了把地址变量当作数组下标,以此来方便处理多变量的问题
int main()
{
	//node a[Maxsize];因为这个数组太大了,定义在这里会发生溢出
	//int b[Maxsize];这个也最好不要在主函数当中定义,也很大
	int first, N, K;
	cin >> first >> N >> K;
	for (int i = 0;i < N;i++)
	{
		int x, y, z;
		cin >> x >> y >> z;
		a[x].data = y;//这个算法把每个输入的地址当做数组下标,把Data当作数组中data的值
		a[x].next = z;//把对应的下一个数据的地址当作该数组中next的值
	}
	int p1 = first;//从给的第一个地址开始找起
	int i = 0;
	while (p1 != -1)//只要地址不为0,则可以找到下一个数据,然后把下一个数据的地址放在b[i++]里面
	{
		b[i++] = p1;//这样,就可以把给出的结点排好序
		p1 = a[p1].next;//这是找p对应的下一个地址,a[p1].next表示的是对应的下一个数据节点的地址
	}
	//这样,就把数据节点全部有序的放在了b数组里面
	int j = 0;
	while (j <= i-K)
	{
		reverse(&b[j], &b[j + K]);//然后利用reverse函数,把位置反转,然后输出自己的地址
		j = j + K;                   //和反转后下一个数据的地址就可以了
	}
	//总体思路是把自己的地址和数据当成一个结点,输出之后再输出i+1结点的地址就可以了
	int s = 0;
	for (s = 0;s < i - 1;++s)
		printf("%05d %d %05d\n", b[s], a[b[s]].data, b[s + 1]);
	printf("%05d %d -1\n", b[s], a[b[s]].data);
	//这里输出五位整数,也可以使用c++中的setw和setfill函数,但是本人觉得比较麻烦
	//于是借鉴了网上c语言的解法
	return 0;
}

未完待续,等有时间去思考一下链表的解法。

题目描述 给定一个常数 $K$ 以及一个单链表 $L$,请编写程序将 $L$ 中每 $K$ 个结点反转。例如:给定 $L$ 为 1→2→3→4→5→6,$K$ 为 3,则输出应该为 3→2→1→6→5→4;如果 $K$ 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 $K$ 个元素不反转。 输入格式 每个输入包含一个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 $N (\le 10^5)$、以及正整数 $K (\le N)$,即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。 接下来有 $N$ 行,每行格式为: Address Data Next 其中 Address 是结点地址;Data 是该结点保存的整数数据;Next 是下一结点的地址。题目保证给出的链表不为空。 输出格式 对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。 输入样例 00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 23333 2 33218 输出样例 00000 4 33218 33218 3 12309 12309 1 99999 99999 5 68237 68237 6 23333 23333 2 -1 题目析 本题需要将链表中每 $K$ 个结点反转,可以采用迭代的方法,每次找到 $K$ 个结点,将这 $K$ 个结点反转,然后将这 $K$ 个结点的前驱结点指向反转后的第一个结点,将反转后的 $K$ 个结点的最后一个结点指向下一个要反转的结点,然后继续进行下一轮反转。 需要注意的是,如果链表长度不足 $K$,则不进行反转。 代码实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值