pta反转链表C语言,PTA basic 1025 反转链表 (25 分) c语言实现(gcc)

给定一个常数 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

核心思路图解

48fa332bdce06ae5dd1e662cd121e722.png

26ce3e5b8733718ba4a623434b6d3c1c.png

190b476f810045130b64c67c9edadda1.png

002165998e3f54ba4e931bbec21d9bc1.png

1 //初步思路声明链表,然后按照头插法插入结点,当index+k<=n的时候,原地翻转index到index+k-1的结点,temp指针指向index的指针指向  2   3 //提交后检测点5超时,显然是给出了极限条件,即当数据足够多的时候,遍历算法的效率急速下降,所要用到链表和指针来解决问题  4   5 //遍历的方法会超时,用静态结构数组存储数据,使用下标作为指针模拟链表,进行链表的局部翻转,然后输出翻转后的结果  6   7 //关于局部翻转的算法  8 //核心思想  9 //首先用三个指针来记录翻转前一个结点地址pre,后一个结点地址next以及当前节点地址current,然后就是处理子链首尾的连接 10 //因为翻转后链表的首地址会发生变化,因此需要单独记录链表的首地址,这里用一次单独的循环来记录,结束后产生的子链首地址就是链表的首地址 11 //题目给出的测试用例中,如果剩余子链不够k个,就不需要翻转,所以还要考虑到剩余结点的连接 12  13 //第一次提交测试034通过,百度看别人写的代码 1.所给数据可能存在无效结点(测试点6通过) 14  15 //第二次提交 使用静态链表方式重写了代码,测试点0246通过 16  17 //第三次提交 制作了图解的链表算法过程 并且修正了多个子链表翻转时候的边界条件,检测点023456通过 18  19 //最后一次提交通过 20  21 //检测点1正好有N=m*K个子串需要翻转 22  23 //检测点0 2 4 6 只有有1个子串,且N>K需要翻转的时候 24  25 //检测点 3 5 有m个子串需要翻转且N>m*K 26  27 //测试用例1 28 //00100 12 4 29 //00000 4 99999 30 //00100 1 12309 31 //68237 6 34257 32 //33218 3 00000 33 //99999 5 68237 34 //12309 2 33218 35 //34257 7 12922 36 //12922 8 98122 37 //98122 9 13812 38 //13812 10 23721 39 //23721 11 12371 40 //12371 12 -1 41  42 //测试用例2 43 //00100 12 4 44 //00000 4 99999 45 //00100 1 12309 46 //68237 6 34257 47 //33218 3 00000 48 //99999 5 68237 49 //12309 2 33218 50 //34257 7 12922 51 //12922 8 98122 52 //98122 9 13812 53 //13812 10 23721 54 //23721 11 12371 55 //12371 12 18271 56 //18271 13 -1 57  58  59 #include "stdio.h" 60 #include "stdlib.h" 61 #include "string.h" 62  63 typedef struct protoTypeNode{ 64     //地址直接用数组下标存储 ,使用的是静态结构体数组,原理和链表一样,但是题目已经给定了数据的地址,没办法使用动态链表来存储固定地址尤其是地址为0的数据, 65     int data; 66     int next; 67 } node; 68  69 //翻转链表核心算法 70 int reverse(node *linkListPointer,int head,int n,int k){ 71     node *lp=linkListPointer;//链表指针 72     int pre=0,current=0,next=0,nexthead,j=0,rear=0,repeatTimes,i; 73      74     //pre用于记录需要翻转的结点的前一个结点地址 75     //current当前翻转结点的地址 76     //next下一个需要翻转结点的地址 77     //nexthead下一个子链的首结点 78     //rear子链翻转后的尾结点(即未翻转的子链的头结点) 79     //repeatTime有多少个子链需要翻转 80     //remainList需要翻转的子链全部翻转后是否还剩下结点 81      82     pre=head;//指向未翻转的子链表的头结点 83     current=lp[head].next;//指向头结点的下一跳结点,同时也是准备翻转的结点,准备用于翻转指向原局部头结点 84     next=lp[current].next;//保存翻转结点的下一跳结点 85     for(i=0;i

3b28efc7484e1f987d04dd7fc1eb20d4.png

后记.

说实话,以前只是知道链表的逻辑,但是手动写代码出来建立一个链表来实现某种算法一直都不会,花了挺长时间一步步debug才搞懂

其实翻转子链的地方并不难理解, 难点是边界处理和子链的链接问题

包括 链表的首地址更新,上一个子链的尾结点和下一个子链的头结点的链接, 更新头尾结点

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值