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个结点局部反转的 ...
随机推荐
- tomcat_下载
1. http://tomcat.apache.org/ 2. 3.
- Entity Framework 6 预热、启动优化
虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com:用户登陆注册 owner.xxx.com:个人用户 ...
- Angular 2 Architecture Overview
Module 简单来说模块(module)就是完成共同目的的代码块,export一些内容例如一个类.函数.或值变量. component就是一个基本的Angular块,一个component类其实也是 ...
- python学习笔记(requests)
昨天用jmeter尝试了下接口测试 在部分接口中要上传文件这里遇到了问题.今天改用python的requests框架试下 先简单的写了个登录的接口.本人初学者,第一次写接口脚本 #!/usr/bin/ ...
- Windows Server 2016 桌面环境的自动配置脚本(2017-10-24更新)
github:https://github.com/m2nlight/WindowsServerToWindowsDesktop 下载:https://github.com/m2nlight/Wind ...
- Mac环境下Android Studio配置Git以及最基本使用
Git是分布式版本管理工具,现在使用十分广泛,相对于SVN,GIT的使用更加方便,在离线环境下,仍然可以进行版本控制工作.且速度十分快.在Windows下,先需要自行安装Git程序,网址git-scm ...
- 关闭SSL服务[iRedMail]
相信有很多朋友接触并使用地iRedMail这个软件了, 其强大的邮件收发功能, 垃圾及病毒检索能力自不用说了. 其自身携带的dovecot组件提供的SSL也足以使人们对这个软件侧目, 但是正是由于这个 ...
- OC-SEL 和 Class
[认识选择器]============================================ SEL 1.选择器(SEL)是一个变量类型. 2.选择器用来装成员消息(成员方法) people ...
- 【python】python内存管理摘要
a = 1 id(a) == id(1) 每次退出ipython重新进入,这个Id都会不一样 sys.getrefcount(a) 可以计数某个对象的引用次数,是原来的次数+1 垃圾回收 使用gc包 ...
- css3 伪类
::selection { 选中后的样式 } 链接 p:only-child p的父级只有一个p标签 p:only-of-type p的父级有一个p标签, 但还可以包含其他标签 p:fis ...