首页 > 其他 > 详细

循环链表学习与约瑟夫环问题

时间:2020-05-04 11:20:24      阅读:61      评论:0      收藏:0      [点我收藏+]

约瑟夫环问题(这里引用自360百科)

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 结果+1即为原问题的解。
现在我简化这个问题,一直有10个小朋友围成一圈(以编号1,2,3,4,5,6,7,8,9,10分别表示)围成一圈。从编号为1的小朋友开始报数,报到9的那个人出列,他的下一个人又从1开始报数,数到9的那人出列;如是循环,直到所有人出列,问:最后一个出列的小朋友的编号是多少?

循环链表

循环链表与单链表相比,不过是将最后一个元素的指针域指向了表头而已,以此来将链表首尾相连。

约瑟夫环问题解决代码

bool Joseph(LinkList*& L, int interval) {
	if (!L) {
		return false;
	}
	if (interval < 1) {
		return false;
	}
	int i = 0, j = 0;
	LinkNode* p = L;
	LinkNode* q = NULL;
	int times = 0, num = 0;
	
	do{
		i += interval;

		while (1) {
			if (p->next != L) j++;
			if (j >= i) break;
			p = p->next;
		}
		times++;
		q = p->next;
		num =q->data;
		cout << "第" << times << "个出列的数是:" << num << endl;
		p->next = q->next;

	} while (L->next != L);
	cout << "最后一个出圈的元素是:" << num << endl;
	return true;
}

就这样

循环链表学习与约瑟夫环问题

原文:https://www.cnblogs.com/Ybossy/p/12825313.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!