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