pat乙级反转链表(好难哦)(没理解代码)

自己写的:(16分)
#include<bits/stdc++.h>
using namespace std;
struct node
{
	string add;
	int data;
	string next;
};
//结构体数组按照某一项进行排序 
bool cmp(node a,node b)
{
	return a.data>b.data;
} 
int main()
{
	string d;
	int n,k;
	cin>>d>>n>>k;//printf读取不成功可以 试试cin 
	node no[n];
	for(int i=0;i<n;i++)
	{
		cin>>no[i].add>>no[i].data>>no[i].next;
	}
	//以上可以成功读取
	
	//创建一个新数组来保存按照地址排序后的
	node non[n];
	int j=0;
	for(int i=0;i<n;i++)
	{
		if(d==no[i].add)
		{
			non[j].add=no[i].add;
			non[j].data=no[i].data;
			non[j].next=no[i].next;
		}	
	}
	//将第一个结点存入到链表当中(上面) 
	for(j=1;j<n;j++)
	{
		for(int i=0;i<n;i++)
		{
			if(non[j-1].next==no[i].add)
			{
				non[j].add=no[i].add;
				non[j].data=no[i].data;
				non[j].next=no[i].next;
			}	
		}
	}
	
	//
//	for(int i=0;i<n;i++)
//	{
//		cout<<non[i].add<<" "<<non[i].data<<" "<<non[i].next<<endl;
//	}

	//对新的结构体进行排序
//	int i=0;
//	while(i<=n-k){
//		sort(non+i,non+k+i,cmp); 
//		i=k+i;
//	}
//	for(int i=0;i<=n-k;i=i+1+k)
//	{
//		sort(non+i,non+i+k,cmp);
//		i=k+i;
//	}
	//先算出排序的次数
	int c=n/k;
	while(c)
	{
		
		int i=0;
		sort(non+i,non+k+i,cmp);
		i=k+1;
		c--;
	} 
	


	//排序好了 地址不对 用左下换右上
	for(int i=1;i<n;i++)
	{
		non[i-1].next=non[i].add;		
	} 
	for(int i=0;i<n;i++)
	{
		cout<<non[i].add<<" "<<non[i].data<<" "<<non[i].next<<endl;
	}
		
	 
	
}
大神的:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int first, k, n, temp;
    cin >> first >> n >> k;
    int data[100005], next[100005], list[100005];
    for (int i = 0; i < n; i++) {
        cin >> temp;
        cin >> data[temp] >> next[temp];
    }
    int sum = 0;//不一定所有的输入的结点都是有用的,加个计数器
    while (first != -1) {
        list[sum++] = first;
        first = next[first];
    }
  //  按照地址形成了一个链表
    for (int i = 0; i < (sum - sum % k); i += k)
        reverse(begin(list) + i, begin(list) + i + k);
        //前面已经按照地址形成了一个链表,现在逆序
    for (int i = 0; i < sum - 1; i++)
        printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);
    printf("%05d %d -1", list[sum - 1], data[list[sum - 1]]);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值