PAT (乙级) Practice |(1008) C++ --链表

题目描述:

1008 数组元素循环右移问题 (20 分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

分析:

我用的链表的方法来移动这个数列。链表的移动是链表里常见的题。但我感觉我这段代码写到后面思路有一点乱······读者可以根据我的思路,优化这段代码,使代码更加简洁一点。

运行结果是正确的。


结果:

提交时间 状态 分数 题目 编译器 耗时 用户
2019/1/16 20:32:49

答案正确

20 1008 C++ (g++) 3 ms 方人也几点

代码:

#include<iostream>
#include<stdlib.h>
using namespace std;

struct node{
    int data;
    node* next;
};

int main(){
    //初始化
    int n,m,i;//n个元素,移动m个位置
    cin>>n>>m;
    m=m%n;//避免循环移动
    node* nod[n];
    node *head,*pre,*p;
    head = new node;
    head->next = NULL;
    //输入
    for(i=0;i<n;i++){
        nod[i] = new node;
        cin>>nod[i]->data;
    }
    //创建链表
    head->next = nod[0];
    for(i=1;i<n;i++){
        nod[i-1] -> next = nod[i];
    }
    nod[n-1]->next = NULL;//最后一位置空
    p = head -> next;

    //移动
    if(m!=0){
    for(i=0;i<n-m;i++){
        pre = p;
        p = p->next;
    }
    pre->next = NULL;
    pre = p;//pre等于要移动的数列头
    while(p->next){
    //pre = p;
    p = p->next;//p等于要移动的数列尾
    }
    //下面将要移动的整个数列加入到head后
    p->next = head->next;
    head->next = pre;
    //输出
    p = head->next;
    while(p  != NULL){
    cout<<(p->data)<<((p->next == NULL)?"":" ");
    p = p->next;}
    }
    else{
        p = head->next;
        while(p  != NULL){
            cout<<(p->data)<<((p->next == NULL)?"":" ");
            p = p->next;}
    }
    return 0;
}

附:

写代码的时候  cout<<(p->data)<<((p->next == NULL)?"":" ");   红色的括号忘记加了,导致输出错误的格式。

发布了26 篇原创文章 · 获赞 9 · 访问量 8239

猜你喜欢

转载自blog.csdn.net/weixin_41664064/article/details/86514403