1074 Reversing Linked List
题意:
每k个元素反转链表,不足k个就不反转。如原链表为1→2→3→4→5→6,k=3,则反转后的链表为3→2→1→6→5→4;若k=4,则反转后的链表为4→3→2→1→5→6。
思路:
这题会比较烦,写代码前一定要现在纸上理清思路,写出关键代码,不然出了错再改来改去真的很浪费时间,要是考试的话估计心态就蹦了。本题是比较经典的“反转链表(指反转整条链表)”的升级版,但做法是一样的。我们可以把“反转”这一动作单独抽象成一个函数,然后遍历链表,每遍历k个结点(假设是pi...pj),就把pi...pj这个子链表进行反转,易错点在于每k个子链表之间该如何衔接而确保不会断链,具体看代码,我已经注释的很详细了。
注:本题是关于“链表”操作非常经典的题目,应当熟练掌握,因为这是非常非常基础的问题。另外,个人觉得有必要说一下的是,网上很多的解题报告,以及《算法笔记》里的题解,都不是真正的“反转”操作,虽然也能AC,但不利于真正掌握链表、指针的操作,有些投机取巧。要是面试写白板代码的时候写成那种样子,是要被鄙视的。
代码:
#include <cstdio> ; struct Node{ int data; int curr,next; }LinkList[N]; //反转操作,记录新链表的头结点和尾结点 //传入时,tail==head,记得加“&” void reverseLinkList(int& head,int& tail) { //如果链表为空,或者只有一个结点,则直接返回 || LinkList[head].next==-) return; ,p=head;//p为工作指针 tail=LinkList[head].curr; ){ int next=LinkList[p].next; ) head=p;//如果next为空,则当前结点为最后一个结点,令其为新链表的头结点 LinkList[p].next=pre; pre=p; p=next; } } int main() { //freopen("pat.txt","r",stdin); int n,k,head; scanf("%d%d%d",&head,&n,&k); int curr,data,next; ;i<n;i++){ scanf("%d%d%d",&curr,&data,&next); LinkList[curr].data=data; LinkList[curr].curr=curr; LinkList[curr].next=next; } int p=head; ,tail=-; ){ ; && cnt<k){ p=LinkList[p].next; cnt++; } ){ int tmp=p; p=LinkList[p].next;//先更新,再截断 LinkList[tmp].next=-;//把子链表截断 //翻转当前含有k个结点的子链表,并分别记录其头结点和尾结点 int tmptail=tmphead; reverseLinkList(tmphead,tmptail); ) newhead=tmphead; else LinkList[tail].next=tmphead; tail=tmptail;//更新尾结点 }else{ LinkList[tail].next=tmphead;//剩余不足k个结点,就把剩余部分直接链在tail后面 p=-;//别忘了 } } p=newhead; ){ printf("%05d %d ",LinkList[p].curr,LinkList[p].data); ) printf("%05d\n",LinkList[p].next); else printf("-1\n"); p=LinkList[p].next; } ; }
【第一次限时AC的时候是这么做的,但这不是纯正“翻转”操作】
#include <cstdio> #include <vector> #include <algorithm> using namespace std; ; struct Node{ int data; int curr,next; }LinkList1[N],LinkList2[N]; int main() { //freopen("pat.txt","r",stdin); int n,k,head; scanf("%d%d%d",&head,&n,&k); int curr,data,next; ;i<n;i++){ scanf("%d%d%d",&curr,&data,&next); LinkList1[curr].data=data; LinkList1[curr].curr=curr; LinkList1[curr].next=next; } ; ,pre=-; vector<Node> temp; ){ temp.push_back(LinkList1[p]); cnt++; if(cnt==k){ reverse(temp.begin(),temp.end()); ){ newhead=temp[].curr; pre=newhead; }else{ LinkList2[pre].next=temp[].curr; pre=temp[].curr; } ; <temp.size();i++){ LinkList2[pre].data=temp[i].data; LinkList2[pre].curr=temp[i].curr; LinkList2[pre].next=temp[i+].curr; pre=temp[i+].curr; } LinkList2[pre].data=temp[i].data; LinkList2[pre].curr=temp[i].curr; LinkList2[pre].next=-; //注意别忘了重置 cnt=; temp.clear(); } p=LinkList1[p].next; } ){ LinkList2[pre].next=temp[].curr; pre=temp[].curr; ; <temp.size();i++){ LinkList2[pre].data=temp[i].data; LinkList2[pre].curr=temp[i].curr; LinkList2[pre].next=temp[i+].curr; pre=temp[i+].curr; } LinkList2[pre].data=temp[i].data; LinkList2[pre].curr=temp[i].curr; LinkList2[pre].next=-; } p=newhead; ){ printf("%05d %d ",LinkList2[p].curr,LinkList2[p].data); ) printf("%05d\n",LinkList2[p].next); else printf("-1\n"); p=LinkList2[p].next; } ; }
1074 Reversing Linked List的更多相关文章
- PAT 1074 Reversing Linked List[链表][一般]
1074 Reversing Linked List (25)(25 分) Given a constant K and a singly linked list L, you are suppose ...
- PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)
1074 Reversing Linked List (25 分) Given a constant K and a singly linked list L, you are supposed ...
- PAT 1074. Reversing Linked List (25)
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elem ...
- PAT Advanced 1074 Reversing Linked List (25) [链表]
题目 Given a constant K and a singly linked list L, you are supposed to reverse the links of every K e ...
- 1074. Reversing Linked List (25)
模拟题,注意当k == 1 与 k == n时情况 #include <stdio.h> #include <string.h> #include <iostream&g ...
- PAT (Advanced Level) 1074. Reversing Linked List (25)
简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...
- PAT甲题题解-1074. Reversing Linked List (25)-求反向链表
题意说的很清楚了,这种题的话,做的时候最好就是在纸上自己亲手模拟一下,清楚一下各个指针的情况, 这样写的时候就很清楚各个指针变量保存的是什么值. PS:一次AC哈哈,所以说自己动手在纸上画画还是很有好 ...
- PAT 1074. Reversing Linked List
#include <cstdio> #include <cstdlib> #include <iostream> #include <unordered_ma ...
- 【PAT甲级】1074 Reversing Linked List (25 分)
题意: 输入链表头结点的地址(五位的字符串)和两个正整数N和K(N<=100000,K<=N),接着输入N行数据,每行包括结点的地址,结点的数据和下一个结点的地址.输出每K个结点局部反转的 ...
随机推荐
- ECS vs. Kubernetes 类似而又不同
C2Container Service (ECS)和Kubernetes (K8s) 都解决了同样的问题:跨越主机集群管理容器.ECS和Kubernetes之间的斗争让我想起了vi和Emacs之间的编 ...
- yii2:frontend/frontactoin curl生成
yii2:frontend/frontactoin curl生成 想要覆写已存在文件,选中 “overwrite” 下的复选框然后点击 “Generator”.如果是新文件,只点击 “Generato ...
- mysql:字符分割,将字符分割成数组
1.分割函数:SUBSTRING_INDEX('浙江温州-中国电信','-','1') 2.用例(筛选'-'前至少4个汉字的数据) a.数据分布 b.筛选sql select t.mobile_n ...
- MYSQL变量和状态
mysql设置变量是在my.cnf文件里,修改配置文件后需要重启mysql的服务,才能生效.但是在线上服务器是不允许随便重启的,我们可以用命令直接修改变量值,使其生效.然后再修改配置文件中的值,以防止 ...
- DGA GAN——GAN在安全中的应用
DGA的模型:https://github.com/Yuren-Zhong/DeepDGA CNN.LSTM.双向LSTM 论文可以看https://openreview.net/pdf?id=BJL ...
- STM32F407: USART 遇到的问题
今天初次使用STM32F407进行USART串口通讯实验,按照f103的代码写完了,发现没法发送数据, 查看文档后发现是由于没有将端口映射到USART1,然后添加如下代码: 1 GPIO_PinAFC ...
- hp g6 2328tx 加装ssd 机械硬盘安装到光驱位置 问题小结
惠普 g6 笔记本从13年入手至今,三年有余,性能啥的开始跟不上了,所有入手了一块ssd,闪迪(sanDisk)加强版 240G的固态硬盘,准备升下级.狗东下午下单,第二天早上7点多到的,把老硬盘换下 ...
- Java丨简单的登录过滤器实现方法
过滤过滤,实际就是把需要和不需要的东西分开! 今天来说道说道我们程序中的‘登录过滤器’ ,首先我们看看一下面的问题: 1.“登录过滤器”是干什么用的? 1)“登录过滤器”就是为了防止在用户没有登录的情 ...
- 剑指offer--36.整数中1出现的次数(从1到n整数中1出现的次数)
暴力挨个数 ---------------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度指 ...
- 任务调度 Spring Task 4(一)
深入浅出spring task定时任务 在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提 ...