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 elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤) which is the total number of nodes, and a positive K (≤) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, and Next is the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

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

Sample Output:

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

题意:

给N个链表结点,以及K,对每K个长度的链表做逆置,输出逆置后的链表。

题解:

不是很熟悉vector.reverse()这种工具,用了两个双端队列和一个栈来实现。最后一个测试点没过,原来是有些节点不在链表上,那么需要重新计算节点个数,加个计数器sum,不一定就是n。

AC代码:

#include<iostream>
#include<algorithm>
#include<deque>
#include<stack>
using namespace std;
struct node{
int v;
int zhi;
int nx;
}a[];
deque<node>q1,q2;
stack<node>st;
int main(){
int root,n,k;
cin>>root>>n>>k;
for(int i=;i<=n;i++){
int x;
cin>>x;
cin>>a[x].v>>a[x].nx;
a[x].zhi=x;//把它自己的编号也要记录下来
}
int sum=;//可能有些节点不在链表上,要重新数
int p=root;
q1.push_back(a[p]);
sum++;
while(a[p].nx!=-){
int next=a[p].nx;
q1.push_back(a[next]);
sum++;
p=next;
}
for(int i=;i<=sum/k;i++){
int c=;
while(!q1.empty()){//k个k个分别装入栈里倒一倒再取出来
node x=q1.front();
q1.pop_front();
st.push(x);
c++;
if(c==k) break;
}
while(!st.empty()){//倒着再取出来
q2.push_back(st.top());
st.pop();
}
}
while(!q1.empty()){
node x=q1.front();
q1.pop_front();
q2.push_back(x);
}
while(!q2.empty()){//输出
node x=q2.front();
q2.pop_front();
if(!q2.empty()) printf("%05d %d %05d\n",x.zhi,x.v,q2.front().zhi);
else printf("%05d %d -1",x.zhi,x.v);
}
return ;
}

别人的代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
struct node{
int add,data,Next;
}a[maxn];
vector<node>valid,ans;
int head,n,k;
int main()
{
for(int i=;i<maxn;i++)a[i].add=i;
scanf("%d%d%d",&head,&n,&k);
for(int i=;i<n;i++)
{
int address;
scanf("%d",&address);
scanf("%d%d",&a[address].data,&a[address].Next);
}
int p=head;
while(p!=-)
{
valid.push_back(a[p]);
p=a[p].Next;
}
int group=valid.size()/k;
for(int i=;i<group;i++)
{
reverse(valid.begin()+i*k,valid.begin()+i*k+k);
}
for(int i=;i<valid.size();i++)
{
if(i!=valid.size()-)printf("%05d %d %05d\n",valid[i].add,valid[i].data,valid[i+].add);
else printf("%05d %d -1\n",valid[i].add,valid[i].data);
}
return ;
}

PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)的更多相关文章

  1. PAT甲级1074 Reversing Linked List (25分)

    [程序思路] 先根据地址按顺序读入节点,入栈,当栈里的元素个数等于k时全部出栈,并按出栈顺序保存,最后若栈不为空,则全部出栈并按出栈的稀饭顺序保存,最后输出各节点 注意:输入的节点中有可能存在无用节点 ...

  2. 【PAT甲级】1074 Reversing Linked List (25 分)

    题意: 输入链表头结点的地址(五位的字符串)和两个正整数N和K(N<=100000,K<=N),接着输入N行数据,每行包括结点的地址,结点的数据和下一个结点的地址.输出每K个结点局部反转的 ...

  3. 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 ...

  4. PTA 02-线性结构3 Reversing Linked List (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/664 5-2 Reversing Linked List   (25分) Given a ...

  5. PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)

    1040 Longest Symmetric String (25 分)   Given a string, you are supposed to output the length of the ...

  6. PAT 甲级 1083 List Grades (25 分)

    1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...

  7. PAT甲级——1130 Infix Expression (25 分)

    1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...

  8. PAT 甲级 1086 Tree Traversals Again (25分)(先序中序链表建树,求后序)***重点复习

    1086 Tree Traversals Again (25分)   An inorder binary tree traversal can be implemented in a non-recu ...

  9. PAT 甲级 1062 Talent and Virtue (25 分)(简单,结构体排序)

    1062 Talent and Virtue (25 分)   About 900 years ago, a Chinese philosopher Sima Guang wrote a histor ...

随机推荐

  1. python笔记42-http请求命令行工具(httpie)

    前言 通常我们需要快速的测试某个接口通不通,一般linux上用curl去发http请求,但是这个命令行工具语法有点复杂了,不够直观. python有一个给人类使用的requests库,非常的简单方便. ...

  2. 修改cloud image密码

    安装libguestfs-tools yum -y install libguestfs-tools.noarch 设置固定密码 virt-customize -a CentOS-7-x86_64-G ...

  3. Python库资源大全【收藏】

    本文是一个精心设计的Python框架.库.软件和资源列表,是一个Awesome XXX系列的资源整理,由BigQuant整理加工而成,欢迎扩散.欢迎补充! 对机器学习.深度学习在量化投资中应用感兴趣的 ...

  4. 2、Python的IDE之PyCharm的使用

    一.Python集成开发环境-Pycharm介绍 PyCharm是一款功能强大的,用于编写复杂需要结构化的功能代码,下面介绍一下 在Windows下如何安装PyCharm . 操作系统:Windows ...

  5. session内置对象

    SimpleDateFormat sdf = new SimpleDateFormat(yyyy年MM月dd日)  //处理日期格式 session.getCreationDate() 是获取sess ...

  6. ES6对象的个人总结

    属性初始值的简写: 当一个对象的属性与本地变量同名时,不需要再写冒号和值,直接写属性名即可 let fullName = '杨三', age = 19; let obj = { fullName: f ...

  7. BZOJ 5305: [Haoi2018]苹果树 组合计数

    一定要注意要乘阶乘,细节很多. code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s ...

  8. 3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(HTTP介绍,TCP实现HTTP下载文件)

    https://www.cnblogs.com/yangfengwu/p/10357564.html 看了好多文章.....唉,还是自己亲自动手用网络监控软件测试吧 先看这个节安装WEB服务器.... ...

  9. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

  10. git下载指定分支到本地

    从网上查了很多方法有很多种,自我感觉下面这种更方便 git clone xxx.git --branch 分支名/dev/...