P 1025 链表反转
转跳点:
给定一个常数 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 (≤)、以及正整数 K (≤),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 − 表示。
接下来有 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
1 for (int i = 0; i < Quotient; i++)
2 {
3 for (int j = 0; j < K / 2; j++)
4 {//因为不是和冒泡那样的连续赋值而是交换所以只要一般的的次数
5
6 //交换
7 ListNode temp = List[K * i + j];
8 List[K * i + j] = List[K * (i + 1) - j - 1];
9 List[K * (i + 1) - j - 1] = temp;
10 }
11 }
为什么交换次数是K/2,举个栗子:1 2 3 4 5,要逆序,最暴力的方法就是从第一个数开始一个个往后移动,这无疑浪费了大量的时间在交换上,认真观察会发现,其实交换将1 和 5交换 2 和 4 就可以达到效果。奇数的时候就是中间位不用动,偶数的时候刚好对半分。所以不分奇偶。
大佬们可以跳过下面这一段(写一个小姐姐看的)被划掉了,看不见看不见。
那为什么是k*I+J和K * (i + 1) - j - 1交换,将I去掉后,不难发现就是将数组第一位和第K位交换,数组第二位和第K-1位上的数交换,以此类推*I是因为这是第I组刚好也相当于下标
i = 0的时候
0 和 k-1 换,
1 和 k-2 换,
……
k/2-1 和 k/2+1
i = 2时
k 和 2k-1 换,
k+1 和 2k-2 换,
……
2k/2-1 和 2k/2+1
……
i = n 时
nk 和 2k-1 换,
nk+1 和 nk-2 换,
……
nk/2-1 和 nk/2+1
最后就是代码了:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define MAXSIZE 100011
4 typedef struct
5 {
6 int Address;
7 int Data;
8 int Next;
9 } ListNode;
10
11 int main(void)
12 {
13 int head, n, K;
14 ListNode List[MAXSIZE];
15 scanf("%d%d%d", &head, &n, &K);
16
17 for (int i = 0; i < n; i++)
18 {
19 scanf("%d %d %d", &List[i].Address, &List[i].Data, &List[i].Next);
20 }
21
22 //线找到首地址
23 for (int i = 0; i < n; i++)
24 {
25 if (List[i].Address == head)
26 {
27 ListNode temp = List[i];
28 List[i] = List[0];
29 List[0] = temp;
30 break;
31 }
32 }
33
34 //整理链表顺序
35 for (int i = 0; i < n; i++)
36 {
37 if (-1 == List[i].Next)
38 {
39 n = i + 1;
40 break;
41 }
42 for (int j = i + 1; j < n; j++)
43 {
44 if (List[j].Address == List[i].Next)
45 {
46 ListNode temp = List[i + 1];
47 List[i + 1] = List[j];
48 List[j] = temp;
49 break;
50 }
51 }
52 }
53
54 //取出需要交换的次数
55 int Quotient = n / K;
56
57 for (int i = 0; i < Quotient; i++)
58 {
59 for (int j = 0; j < K / 2; j++)
60 {//因为不是和冒泡那样的连续赋值而是交换所以只要一般的的次数
61
62 //交换
63 ListNode temp = List[K * i + j];
64 List[K * i + j] = List[K * (i + 1) - j - 1];
65 List[K * (i + 1) - j - 1] = temp;
66 }
67 }
68
69 //重写地址
70 for (int i = 0; i < Quotient * K; i++)
71 {
72 List[i].Next = List[i + 1].Address;
73 }
74 List[n - 1].Next = -1;
75
76
77 for (int i = 0; i < n; i++)
78 {
79 if (-1 == List[i].Next)
80 {//特殊处理-1;
81 printf("%05d %d %d\n", List[i].Address, List[i].Data, List[i].Next);
82 continue;
83 }
84 printf("%05d %d %05d\n", List[i].Address, List[i].Data, List[i].Next);
85 }
86
87 return 0;
88 }
这几组是我自己的测试数据可以拿去试试(还有一组丢了,有无效数据不能整除的)这几组数据过了之后,应该就能A了
有无效数据 能整除 不能整除
PTA不易,诸君共勉!
P 1025 链表反转的更多相关文章
- PAT 乙级-1025 链表反转
给定一个常数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,即最后 ...
- 链表反转leetcode206
最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...
- 链表反转 (Multi-method)
链表反转是链表相关问题最基础的知识,做完LeetCode中LinkedList后才会有这种体会,因为ACM算法中不会涉及这一部分.解决这一问题有多种方法,在面试中面试官通常也会要求写出多种.包括sta ...
- java实现单链表反转
一.简介 经查阅,主要有两种方法实现链表反转,递归反转法和遍历反转法: 递归: 在反转当前结点之前先反转其后边的结点,即.从尾结点开始逆向反转各个节点的指针域指向: 遍历:从前往后反转各个结点的指针域 ...
- C++ 单向链表反转
单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...
- c语言:链表排序, 链表反转
下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...
- 【Java数据结构】Java数据结构之链表反转
我们都知道用C可以很简单的实现单链表反转,今天来学习下,在Java中如何实现链表反转. 思路很简单,定义一个类,这个类分成2块,一块是表示自身的标志,另外一个存储指向下一个元素的引用.通过互换相邻两个 ...
- [LeetCode] 链表反转相关题目
暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...
- 单链表反转(Singly Linked Lists in Java)
单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法 package dsa.linkedlist; public class Node<E> ...
随机推荐
- OpenCV数字识别
输入命令: conda install opencv 返回信息:
- Linux CentOS7 VMware 环境变量PATH、cp命令、mv命令、文档查看cat/more/less/head/tail——笔记
一.环境变量PATH PATH一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径. 命令在这几个目录里面就不需要敲绝对路径 echo $PATH 例子:把/tmp/ 加到 $PA ...
- 「CF161B」Discounts
传送门 Luogu 解题思路 贪心地想一想,我们肯定要让凳子去给价格越高的商品打半价,那么我们就先按照价格排序,但是要优先把凳子排在前面. 然后我们发现一条凳子肯定只能给价格小于等于它本身的物品打半价 ...
- 1-8SpringBoot之切面AOP
SpringBoot提供了强大AOP支持,我们前面讲解过AOP面向切面,所以这里具体AOP原理就补具体介绍: AOP切面主要是切方法,我们一般搞一些日志分析和事务操作,要用到切面,类似拦截器: @As ...
- NLP之gensim
一. 利用 jieba 进行分词,关键词提取 利用gensim下面的corpora,models,similarities 进行语料库建立,模型tfidf算法,稀疏矩阵相似度分析 # -*- codi ...
- GSON使用笔记(3) -- 如何反序列化出List
GSON使用笔记(3) -- 如何反序列化出List 时间 2014-06-26 17:57:06 CSDN博客原文 http://blog.csdn.net/zxhoo/article/deta ...
- 本地Git仓库与GitHub/GitLab仓库同步
本地仓库即为在你的电脑上的项目文件,远程仓库即为服务器仓库,如GitHub.GitLab或其他等.此处以GitHub介绍本地仓库与远程仓库的同步.可先创建本地仓库,也可先创建GitHub仓库,但都需要 ...
- python机器学习基本概念快速入门
//2019.08.01机器学习基础入门1-21.半监督学习的数据特征在于其数据集一部分带有一定的"标记"和或者"答案",而另一部分数据没有特定的标记,而更常见 ...
- JS操作小记
this.Phenomenon.forEach(element => { if (element.value3 == this.prvphe) { this.Reason1 = element. ...
- MyEclipse8.5 + jdk 1.6.0_43 + tomcat6 + maven 3.0.4 + win7 32位 ,环境搭建并看到“hello world”
一.前期准备 1.首先安装jdk,具体略,用java -version在cmd中看到下图所示就说明安装好了 2.安装tomcat6,具体略,在浏览器中输入http://localhost:8080/, ...