这段时间单链表用顺手了,就用单链表存储要右移的数组元素
分析
这道题的核心问题是数组A右移M个位置时,这M个位置上的数据元素如何存储。在不允许使用另外数组的前提下,我想到的是用单链表来存储,简单,方便。
思路:
①把M个位置的数组元素先保存起来
②右移前n-m个元素
③把①中保存的元素重新放回数组。
1.保存M个位置上的数组元素
从n-m
的下标准开始,向右依次保存
node* head = NULL,*p1 = head, *p2 = NULL;//head为头结点,p1,p2循环遍历结点
for(i = n - m;i < n;i++){//保存右移的数
p1 = new node;
p1->data = a[i];
p1->next = NULL;
if(!head) head = p1;
else p2->next = p1;
p2 = p1;
}
2.右移
a[n-1] = a[n-m-1];
a[n-2] = a[n-m-2];
......
a[n-i] = a[n-i-m];
......
a[m] = a[0];
所以
if(m != 0){//m=0的时候不做无谓的移动
for(i = 1;i <= n - m;i++) //右移
a[n - i] = a[n - m - i];
}
3.数组元素放回
放回时要放在数组下标为0......m-1
的数组元素中。
p1 = head,p2 = p1;
for(i = 0;i < m;i++){//将最后M个数循环移至最前面的M个位置
a[i] = p1->data;
p1 = p2->next;
delete p2;
p2 = p1;
}
到这里,还不能直接输出,我们只考虑到了n >= m
的情况,那么,对于n < m
呢?
一般来说,n < m
时直接退出程序就可以了,但是pat测试点1,2过不了,所以要对于这种情况,不能简单粗暴的return 0
,我们需要m = m % n
,这个是参考博主-打孔猿的博客文章的。
if(n < m) m = m % n;
此时,我们的程序终于完成了,接下来直接输出就可以了
for(i = 0;i < n - 1;i++) cout<<a[i]<<' ';
cout<<a[i]<<endl;
完整的程序代码
#include<iostream>
using namespace std;
struct node{
int data;
node* next;
};
int main(){
int m,n;
cin>>n>>m;
if(n < m) m = m % n;
int* a=new int[n];
int i;//计数
for(i = 0;i < n;i++) cin>>a[i];
node* head = NULL,*p1 = head, *p2 = NULL;
for(i = n - m;i < n;i++){//保存右移的数
p1 = new node;
p1->data = a[i];
p1->next = NULL;
if(!head) head = p1;
else p2->next = p1;
p2 = p1;
}
if(m != 0){
for(i = 1;i <= n - m;i++) //右移
a[n - i] = a[n - m - i];
}
p1 = head,p2 = p1;
for(i = 0;i < m;i++){//将最后M个数循环移至最前面的M个位置
a[i] = p1->data;
p1 = p2->next;
delete p2;
p2 = p1;
}
//输出
for(i = 0;i < n - 1;i++) cout<<a[i]<<' ';
cout<<a[i]<<endl;
delete []a;
}