目录
描述:
编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。
下一个人继续从 1 开始报数。
n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?
数据范围:1<=n,m<=10000
1.定义节点
objectivec
typedef struct ListNode
{
int val;
struct ListNode* next;
}ListNode;
2.创建节点
objectivec
//创建节点
ListNode* BuyNode(int x)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
if (node == NULL)
{
perror("node malloc");
exit(1);
}
node->val = x;
node->next = NULL;
return node;
}
3.创建不带头循环单链表
objectivec
//创建不带头循环单链表
ListNode* CreateCircle(int n)
{
ListNode* head = BuyNode(1);
ListNode* ptail = head;
int i = 0;
for (i = 2; i <= n; i++)
{
ptail->next = BuyNode(i);
ptail = ptail->next;
}
ptail->next = head;
return ptail;//m为1时,需要知道尾节点的地址
}
4.约瑟夫函数实现
objectivec
int ysf(int n, int m)
{
ListNode* prev = CreateCircle(n);//指向尾节点
ListNode* pcur = prev->next;//指向第一个节点
int count = 1;//pcur已经指向第一个节点
while (pcur->next != pcur)
{
if (count != m)
{
prev = prev->next;
pcur = pcur->next;
count++;
}
else
{
prev->next = pcur->next;
free(pcur);
pcur = prev->next;
count = 1;
}
}
int ret = pcur->val;
free(pcur);
pcur = prev = NULL;
return ret;
}
最后四行代码是将pcur所指向的地址空间释放,先存pcur->val的值,再释放,不然找不到了
5.总代码
objectivec
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode
{
int val;
struct ListNode* next;
}ListNode;
//创建节点
ListNode* BuyNode(int x)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
if (node == NULL)
{
perror("node malloc");
exit(1);
}
node->val = x;
node->next = NULL;
return node;
}
//创建不带头循环单链表
ListNode* CreateCircle(int n)
{
ListNode* head = BuyNode(1);
ListNode* ptail = head;
int i = 0;
for (i = 2; i <= n; i++)
{
ptail->next = BuyNode(i);
ptail = ptail->next;
}
ptail->next = head;
return ptail;//m为1时,需要知道尾节点的地址
}
int ysf(int n, int m)
{
ListNode* prev = CreateCircle(n);//指向尾节点
ListNode* pcur = prev->next;//指向第一个节点
int count = 1;//pcur已经指向第一个节点
while (pcur->next != pcur)
{
if (count != m)
{
prev = prev->next;
pcur = pcur->next;
count++;
}
else
{
prev->next = pcur->next;
free(pcur);
pcur = prev->next;
count = 1;
}
}
int ret = pcur->val;
free(pcur);
pcur = prev = NULL;
return ret;
}
int main()
{
int m, n;
scanf("%d,%d", &m, &n);
printf("%d", ysf(m, n));
return 0;
}