主体思路:创建一个循环链表,每个节点储存的数据表示他们的位置,每出去一个就删除一个节点,并且将链表大小减一,当链表只剩一个节点时,终止循环
注意的点:
1.因为删除要找上一个节点,所以是m-1
2.因为在本题中只需要输出对应元素就好了,所以不需要更改尾指针,没有必要
#include<bits/stdc++.h>
using namespace std;
class node
{
public:
node* next;
int data;
node(int a)
{
data = a;
next = NULL;
}
};
class circular_list
{
node* tail;
int size;
public:
friend void josephus(circular_list a, int m);
int get_size()
{
return size;
}
circular_list()
{
size = 0;
tail = NULL;
}
void create(int a[], int n)
{
node* head = tail;
size = n;
for (int i = 0; i < n; i++)
{
node* s = new node(a[i]);//因为有尾指针,所以不需要再加一个指针
if (head == NULL)
{
head = s;
}
else
{
tail->next = s;
}
tail = s;
}
tail->next = head;
}
void insert(int a, int b)//在b位置插入数据a
{
node* p = tail;
for (int i = 0; i < b - 1; i++)
{
p = p->next;
}
node* s = new node(a);
s->next = p->next;
p->next = s;
if (b == size + 1)//如果在尾部插入
{
tail = s;
}
size++;
}
void deletee(int b)
{
node* p = tail;
for (int i = 0; i < b - 1; i++)
{
p = p->next;
}
node* m = p->next;
p->next = p->next->next;
if (b == size)//如果在尾部删除
tail = p;
delete m;
size--;
}
void print()
{
node* p = tail;
for (int i = 0; i < size; i++)
{
cout << p->next->data << " ";//因为保存的是尾指针,所以要从头开始输出的话要p->next
p = p->next;
}
cout << endl;
}
};
void josephus(circular_list a,int m)
{
node* p = a.tail;
while (1)
{
if (a.get_size() == 1)
{
cout << p->data<<endl;
break;
}
else
{
for (int i = 0; i < m-1; i++)
{
p = p->next;
}
cout << p->next->data<<" ";
node* m = p->next;
p->next = p->next->next;
delete m;
a.size--;
}
}
}
int main()
{
int n, m;
cin >> n >> m;
int* a = new int[n];
int i;
for (i = 0; i < n; i++)
{
a[i] = i + 1;
}
circular_list b;
b.create(a, n);
josephus(b, m);
}