已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* create(int n) { // 1 2 3 ……n
Node* cur, *q, *head;
cur = (Node*)malloc(sizeof(Node));
head = cur;
cur->data = 1;
for (int i = 2; i <= n; i++) {
q = (Node*)malloc(sizeof(Node));
q->data = i;
cur->next = q;
cur = q;
}
cur->next = head;
return head;
}
void printLink(Node* head) {
if (head == NULL) {
cout << "空链表" << endl;
return;
}
Node* p = head;
while (head != NULL) {
cout << p->data << endl;
p = p->next;
}
}
void processLink(Node* head, int k, int m) { //从编号为k(1<=k<=n)的人开始报数,数到m的那个人出列;
Node* cur = head;
Node* tmp = cur;
//找到编号为k的节点
while (cur->data != k) {
cur = cur->next;
}
while (cur->next != cur) {
//找到第m个数
for (int i = 0; i < m; i++) {
tmp = cur;
cur = cur->next;
}
cout << cur->data;
tmp->next = cur->next;
free(cur);
cur = tmp->next;
}
cout << cur->data;
free(cur);
}
//12345 41325
int main() {
Node *node = create(5);
processLink(node, 3, 1);
}