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

约瑟夫环问题(这里引用自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;
}

就这样

猜你喜欢

转载自www.cnblogs.com/Ybossy/p/12825313.html