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. iptable千万不要yum remove iptables

    iptable千万不要运行yum remove iptables,进行卸载打开linux后发现没有firewalld和iptables,建议安装firewall 命令: yum install fir ...

  2. 模型融合---CatBoost 调参总结

    一.参数速查 1.通用参数 2.性能参数 3.处理单元设置 二.分类 三.回归

  3. KVM-virsh常用命令

    virsh list #在线VM virsh list --all #所有VM virsh start #开机 virsh shutdown #软关机 virsh destroy #强制关机 virs ...

  4. ARTS-week5

    Algorithm 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组.说明:初始化 nums1 和 nums2 的元素数量分别 ...

  5. Thinkphp下实现D函数用于实例化Model格式

    * D函数用于实例化Model 格式 项目://分组/模块 * @param string $name Model资源地址 * @param string $layer 业务层名称 * @return ...

  6. HBase的二级索引

    使用HBase存储中国好声音数据的案例,业务描述如下: 为了能高效的查询到我们需要的数据,我们在RowKey的设计上下了不少功夫,因为过滤RowKey或者根据RowKey查询数据的效率是最高的,我们的 ...

  7. lxml_time_代理

    import requests from pyquery import PyQuery as pq import json import jsonpath from lxml import etree ...

  8. sql server 能按照自己规定的字段顺序展示

    工作中遇到,需要把sql 查询的按照指定的顺序显示 select plantname,cc_type,all_qty from VIEW_TEMP_DAY_CVT_CAP a where a.docd ...

  9. vue+elementUI完成注册及登陆

    1. vue怎么引入和配置使用element-ui框架 1.1 使用vue-cli脚手架工具创建一个vue项目 vue init webpack pro01 1.2 npm安装elementUI cd ...

  10. pgloader 方便的数据迁移工具

    pgloader 是一个支持多种数据源迁移到pg 数据库的工具,高性能,使用灵活同时作者 也提供了docker 版本的镜像,今年3月份使用此工具的时候,发现好久都没更新了,但是 最近作者有了新版本的发 ...