pat甲级1074. Reversing Linked List (25)、乙级1025. 反转链表 (25)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/79508003

欢迎访问我的pat甲级题解目录哦https://blog.csdn.net/richenyunqi/article/details/84981078

欢迎访问我的pat乙级题解目录哦https://blog.csdn.net/richenyunqi/article/details/84981369

题目描述

甲级题目描述

乙级题目描述

 

算法设计:

  1. 由于所给的地址是5位非负整数,可以定义两个维度为100005的一维数组data、Next,负责储存数据域和下一个地址
  2. 定义一个vector<int>listAddress,由所给链表开始地址处开始遍历整个链表,按遍历顺序将各结点地址储存到listAddress中。
  3. 按要求对listAddress数组进行翻转,可以利用c语言库里的reverse函数

  4. 按格式要求进行结果输出

注意点:

(1)题目给出的结点中可能有不在链表中的无效结点

(2)翻转时要注意如果最后一组要翻转的结点数量小于K,则不进行翻转;如果等于K,需要进行翻转

(3)输出时结点地址除-1外要有5位数字,不够则在高位补0 。所以地址-1要进行特判输出

C++代码

#include<bits/stdc++.h>
using namespace std;
int data[100005],Next[100005];
int main(){
    int begin,N,K;
    scanf("%d%d%d",&begin,&N,&K);
    for(int i=0;i<N;++i){//读取数据
        int address;
        scanf("%d",&address);
        scanf("%d%d",&data[address],&Next[address]);
    }
    vector<int>listAddress;//储存链表结点地址
    while(begin!=-1){
        listAddress.push_back(begin);
        begin=Next[begin];
    }
    for(int i=K;i<=listAddress.size();i+=K)//进行翻转
        reverse(listAddress.begin()+i-K,listAddress.begin()+i);
    for(int i=0;i<listAddress.size()-1;++i)//输出
        printf("%05d %d %05d\n",listAddress[i],data[listAddress[i]],listAddress[i+1]);
    printf("%05d %d -1\n",listAddress.back(),data[listAddress.back()]);
    return 0;
}

 

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭