我们经常会碰到类似“约瑟夫环”的问题,这类环类问题,一般可以使用单向循环链表来使用。
#include <iostream>
#include <malloc.h>
typedef struct Person
{
int ID;
Person *next;
}m_Person;
m_Person* CreateLinkedList(int number,int *array) {
m_Person *head = NULL;
m_Person *p1, *p2 = NULL;
p2 = p1 = (m_Person*)malloc(sizeof(m_Person));
p1->ID = array[0];
for (size_t i = 0; i < number; i++){
if (head == NULL) {
head = p1;
p2 = p1;
}
else{
p1 = (m_Person*)malloc(sizeof(m_Person));
p1->ID = array[i];
p2->next = p1;
p2 = p1;
}
}
p2->next = head;
p1 = NULL;
free(p1);
return head;
}
m_Person* isEnd(m_Person* L) {
m_Person *Temp = L;
while (Temp->next!=L) {
Temp = Temp->next;
}
return Temp;
}
void Joseph(m_Person *L, int m) {
m_Person *Current = L;
m_Person *NewHead = L;
if (NewHead != NULL) {
while (NewHead->next != NewHead) {
for (size_t i = 0; i < m - 1; i++) {
Current = L;
L = L->next;
}
if (NewHead == L) {
m_Person* End = isEnd(L);
std::cout << NewHead->ID << " ";
End->next = NewHead->next;
NewHead = NewHead->next;
L = NewHead;
}
else {
std::cout << L->ID << " ";
Current->next = L->next;
L = L->next;
}
}
std::cout << NewHead->ID;
}
}
int main() {
int n,m;
std::cin >> n >> m;
int *p = new int[n];
for (size_t i = 0; i < n; i++) {
p[i] = i + 1;
}
m_Person *Head = CreateLinkedList(n, p);
Joseph(Head, m);
std::cin.get();
std::cin.get();
}版权声明:本文为u010202481原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。