前言:
约瑟夫问题是一个很经典的问题,当我们学习完链表的知识,写这道题可以加深我们对链表的理解,也会对链表的知识有一个巩固的作用,接下来就让我们来写一下这道题
牛客链接:环形链表的约瑟夫问题_牛客题霸_牛客网
1.大体思路:
通读题目,我们可以有一些大体的思路,从1-n围成一圈,那么也就是说我们要创建一个带环链表,最后只剩下一个人,那么也就是说最后链表自己指向自己,接下来让我们来画图分析一下!
接下来让我们来实现一下:
2.实现
2.1 创建带环链表
我们要创建一个带环的链表,那么也就是说我们需要链表的尾节点的下一个要指向我们的头节点,这样就可以循环起来了,我们需要使用malloc动态开辟内存!
2.2实现计数,报数到m就销毁
3.整体代码
typedef struct ListNode ListNode;
ListNode* buy_node(int n)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->val = n;
node->next = NULL;
return node;
}
ListNode* createbandlist(int n)
{
ListNode* phead = buy_node(1);
ListNode* patil = phead;
for(int i=2; i<=n; i++ )
{
patil->next = buy_node(i);
patil = patil->next;
}
patil->next = phead;
return patil;
}
int ysf(int n, int m ) {
//封装一个函数实现创建带坏链表
ListNode* perv = createbandlist(n);
ListNode* pcur = perv->next;
int count = 1;//计数
while(pcur->next != pcur)
{
if(count == m)
{
//杀掉
perv->next = pcur->next;
free(pcur);
pcur = perv->next;
count = 1;
}
else {
{
//继续计数
perv = pcur;
pcur = pcur->next;
count++;
}
}
}
return pcur->val;
}
结语:
当我们写完这个题目,会对链表的使用更加熟悉,有利于我们更加深入学习,当然了这个问题可以使用数组去解决,会很多办法可以实现约瑟夫问题,希望这边博客对大家有帮助,大佬互三 !