1008 数组元素循环右移问题

1008 数组元素循环右移问题

这个问题实际上还是比较容易解出来的,比如可以用链表,也可以用数组交换,也可按照特定顺序直接输出;

  • 直接输出方式:我们可以想象一下,数据循环移动,不过是从数组的中间部分开始输出,然后回到开头,继续输出,直到数组元素全部输出。比如数组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

原文地址:https://www.cnblogs.com/2015-16/p/13301971.html