约瑟夫问题循环链表实现

问题描述:

n个人围成一个圈,每个人分别标注为1、2、…、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。

#include<iostream>
using namespace std;

struct Node{
	int val;
	Node *next;
	Node(int v){ val = v; next = NULL; }
};

//约瑟夫问题
void JOSEPHUS(int n, int k){
	Node *p = NULL; //p表示开始指针
	Node *current = NULL;
	Node *previous = NULL;
	for (int i = 0; i < n; ++i){
		if (i == 0){
			p = new Node(1);
			previous = p;
			continue;
		}
		current = new Node(i + 1);
		previous->next = current;
		previous = current;
	}
	previous->next = p;
	
	while (p->next != p){
		for (int j = 1; j < k-1; ++j){
			p = p->next;
		}
		cout << p->next->val << ' ';
		p->next = p->next->next;
		p = p->next;
	}
	cout << p->val << endl;
	cout << "Winner is " << p->val << endl;
}

int main(){
	JOSEPHUS(10, 4);
	return 0;
}

《约瑟夫问题循环链表实现》

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/Andrewseu/article/details/60960688
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞