在学数组的时候做过一次这道题,使用了取模的办法实现了循环数组来解决这道题。
在学完链表以后再次看到这道题便使用链表来做了一遍。
题目描述
m 个人围成一圈,从第一个人开始报数,数到 n 的人出列,再由下一个人重新从 1开始报数,数到 n 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
用链表能非常简单且清晰的解决这道问题。
用head,back分别保存头节点和尾节点的地址,该链表的尾节点指向头节点形成一个环状。
代码如下
#include<bits/stdc++.h>
using namespace std;
struct node{
int data;
node* next;
};
node* head = NULL;
node* back = NULL;
int main() {
int m, n;
cin >> m >> n;
node* temp1=head;
for (int i = 1; i <= m; i++){
node* temp = new node;
if (head == NULL) {
head = temp; temp1 = head;
}
temp1->next = temp;
temp->data = i;
temp->next = head;
temp1 = temp1->next;
if (i == m) back = temp;
}
node* temp = back;
for (int i = 1, k = 0; i <= n * m; i++) {
if (i % n == 0) {
cout << temp->next->data<<" ";
temp->next = temp->next->next;
}
if (i % n != 0) {
temp = temp->next;
}
}
}