这个问题实际上还是比较容易解出来的,比如可以用链表,也可以用数组交换,也可按照特定顺序直接输出;
-
直接输出方式:我们可以想象一下,数据循环移动,不过是从数组的中间部分开始输出,然后回到开头,继续输出,直到数组元素全部输出。比如数组a[10],1 2 3 4 5 6 7 8 9 10 ,当我们移动3个数据位的时候,输出序列就是 :8 9 10 1 2 3 4 5 6 7 ,那么是不是可以取巧,直接从8开始输出,然后回到1,再输出到7呢?——可以
-
数组交换:我担心直接输出数据不行,那我交换数据,就用那种老老实实的方法,总没问题吧。可以,但是相对复杂一点,首先每一次挪动一个数据,把最后面的数据放入第一个数据位,剩下的往后挪一位,这样循环m次,可以达到我们的目的。然后直接输出即可。
-
链表方式:我觉得这个方式是比较好的,首先建立链表,当然,采取尾插法比较好,这样产生的链表序列是正序,方便处理。不过还需要注意一点,那就是关于最后一个节点的next应该接上第一个结点。这实际上是一个带头结点的单循环链表。当我们的链表建立完成之后,其实得到了一个围成了一个圆的数据组,我们按照个数m开始数,数到第m+1个数据时,开始输出,直到我们回到这个节点,数据输出完毕,我觉得这样做简便很多。
下面给出对应的相关代码:
//直接输出方式
int main()
{
int N,M;
cin>>N>>M;
int * array = new int [N];
for(int i = 0;i < N;i++)
cin>>array[i];
M = M % N;
for(int j = N - M, i = 0;i < N;j++, i++) {
if(j == N)
j = 0;
cout<<array[j];
if(i != N-1)
cout<<" ";
}
return 0;
}
//链表方式
struct List {
int data;
struct List * next;
};
int main()
{
int N,M;
cin>>N>>M;
List * head = (List *)malloc(sizeof(List));
List * p,* temp = head;
//尾插法建立链表
for(int i = 0;i < N;i++) {
p = (List *)malloc(sizeof(List));
cin >> p->data;
temp->next = p;
temp = p;
}
//尾结点连接上首节点
temp->next = head->next;
temp = head;
M = M % N;
//寻找出输出开头的节点
for(int i = 0;i < N-M;i++)
temp = temp->next;
head = temp;
//输出链表
List * out = head->next;
for(int i = 0;i < N;i++) {
cout << out->data;
if(i != N-1)
cout << " ";
out = out->next;
}
return 0;
}
//数组交换
for(i = 0;i < m;i++) { t = a[n-1]; for(j = n-m;j >= 0;j--) { a[j+1] = a[j]; } a[0] = t; }//数据整体往后挪一位,然后最后一位放在最前面,循环m次即可
2020-07-14