C语言笔记34 •单链表经典算法OJ题-6.环形链表的约瑟夫问题•

环形链表的约瑟夫问题

1.问题

编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。

下一个人继续从 1 开始报数。

n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?

数据范围: 1≤𝑛,𝑚≤100001≤n,m≤10000

进阶:空间复杂度 𝑂(1)O(1),时间复杂度 𝑂(𝑛)O(n)

2.代码实现

cpp 复制代码
//6.环形链表的约瑟夫问题
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>




typedef int SLTDataType;

typedef struct SListnode
{
	SLTDataType val;
	struct SListnode* next;
}ListNode;

ListNode* createNode(SLTDataType val)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(1);
	}
	newnode->val = val;
	newnode->next = NULL;
	return newnode;
}

//创建带环链表
ListNode* createCircleList(int n)
{
	ListNode* phead= createNode(1);
	ListNode* ptail = phead;
	for (int i = 2; i <= n; i++)
	{
		ptail->next = createNode(i);
		ptail = ptail->next;
	}
	ptail->next = phead;//首尾相连,链表成环
	return ptail;
}

int person_num(int n,int m)
{
	ListNode* ptail = createCircleList(n);
	ListNode* pcur = ptail->next;
	int count = 1;
	while (ptail->next != ptail)
	{
		if (count == m)//销毁节点
		{
			ptail->next = pcur->next;
			free(pcur);
			pcur = ptail->next;
			count = 1;
		}
		else
		{
			ptail = ptail->next;//等价于ptail = pcur;
			pcur  = pcur->next;
			count++;
		}
	}
	return ptail->val;

}

int main()
{
	int person = person_num(5, 2);
	printf("%d", person);

	return 0;
}
相关推荐
Hammer_Hans4 分钟前
DFT笔记26
笔记
晚风吹长发5 分钟前
初步了解Linux中的信号捕捉
linux·运维·服务器·c++·算法·进程·x信号
机器学习之心9 分钟前
MATLAB基于GA-ELM与NSGA-Ⅱ算法的42CrMo表面激光熔覆参数多目标优化
算法·matlab·ga-elm
TracyCoder1239 分钟前
LeetCode Hot100(17/100)——240. 搜索二维矩阵 II
算法·leetcode
FJW0208149 分钟前
haproxy的调度算法
算法
小程同学>o<10 分钟前
嵌入式之C/C++(二)内存
c语言·开发语言·c++·笔记·嵌入式软件·面试题库
浅念-10 分钟前
C语言——内存函数
c语言·经验分享·笔记·学习·算法
●VON10 分钟前
Flutter for OpenHarmony:基于 SharedPreferences 的本地化笔记应用架构与实现
笔记·学习·flutter·ui·架构·openharmony·von
MicroTech202516 分钟前
微算法科技(NASDAQ:MLGO)基于后量子阈值算法的区块链隐私保护技术
科技·算法·区块链
求真求知的糖葫芦17 分钟前
耦合传输线分析学习笔记(九)对称耦合微带线S参数矩阵推导与应用(下)
笔记·学习·矩阵·射频工程