1025 反转链表 (25 分)

想法:

这题必须写两句。首先我感受到了大佬来自智商的碾压,大佬的代码贴在最后。另外就是我做题 太烂了,写的我自己都看不下去,反观大佬的代码,逻辑清晰,思维跳跃,这才是人才。我差的不是一星半点。

这题用了两个多小时,真是太菜了。

坚持下来对自己来说也是有进步吧。

题目

给定一个常数 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 行给出第 1 个结点的地址、结点总个数正整数 N (≤105)、以及正整数 K (≤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
12309 2 33218

结尾无空行

输出样例:

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

结尾无空行

我的代码:

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    string s1;
    int n;
    string s2;
};
typedef struct Node List;
int main()
{
    string s;
    int n,k,i,j,pt,flag = 1;
    List a[100000],temp;
    cin>>s>>n>>k;
    for(i = 0;i < n;i++)
    {
        cin>>a[i].s1>>a[i].n>>a[i].s2;
    }
    i = 0;
    j = 0;
    pt = 0;
    //按地址排序
    while(flag)
    {
        for(i = pt;i < n;i++)
        {
            if(a[i].s1 == s)
            {
                s = a[i].s2;
                temp = a[pt];
                a[pt] = a[i];
                a[i] = temp;
                pt++;
                if(s == "-1")
                {
                    flag = 0;
                    n = pt;
                }
                break;
            }
        }
    }
    
    //反转
    /*
    00100 1 12309
    12309 2 33218
    33218 3 00000
    00000 4 99999
    99999 5 68237
    68237 6 -1
    
    
    00000 4 33218
    33218 3 12309
    12309 2 00100
    00100 1 99999
    99999 5 68237
    68237 6 -1
    */
    int num1 = n / k;//逆序输出num1轮
    int num2 = n - n % k;//顺序输出的开始下标
    int now = 0;
    int m;
    string tempS;
    for(i = 0;i <num1;i++)
    {
        for(j = i * k,m = i * k + k -1;j - i * k < k / 2;j++,m--)
        {
            temp = a[j];
            a[j] = a[m];
            a[m] = temp;
        }
    }
    a[n - 1].s2 = "-1";
    for(i = n - 1;i > 0;i--)
    {
        a[i - 1].s2 = a[i].s1;
    }
    //输出全部
    for(i = 0;i < n;i++)
    {
        cout<<a[i].s1<<' '<<a[i].n<<' '<<a[i].s2<<endl;
    }
}

大佬的代码:(膜拜)

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
 	int address;
 	int num;
 	int next;
}Node;

int main()
{
 	int i, j, n, m, k, roll, next;
 	Node *node, tmp; 
 	
 	scanf("%d%d%d", &next, &n, &k);
 	node = (Node*)malloc(sizeof(Node) * n);
 	for (i = 0; i < n; i++)
 	{
  		scanf("%d%d%d", &node[i].address, &node[i].num, &node[i].next);
 	}
 	for (i = 0; i < n; i++)
 	{
  		for (j = i; j < n; j++)
  		{
   			if (node[j].address == next)
   			{
    				tmp = node[i];
    				node[i] = node[j];
    				node[j] = tmp;
    				next = node[i].next;
    				if (node[i].next == -1)
    				{
     					n = i + 1;
    				}
    				break;
   			}
  		}
 	}
 	roll = n / k;
 	for (j = 0; j < roll; j++)
 	{
  		for (m = k - 1, i = j * k; i - j * k < k / 2; i++, m--)
  		{
   			tmp = node[i];
   			node[i] = node[m + j * k];
   			node[m + j * k] = tmp;
  		}
 	}
 	node[n - 1].next = -1;
 	for (i = n - 1; i > 0; i--)
 	{
  		node[i - 1].next = node[i].address;
 	}
 	for (i = 0; i < n; i++)
 	{
  		if (i == n - 1)
  		{
   			printf("%05d %d %d\n", node[i].address, node[i].num, node[i].next);
   			break;
  		}
  		printf("%05d %d %05d\n", node[i].address, node[i].num, node[i].next);
 	}
 	
 	system("pause");
 	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值