数据结构老师在课上提到的 故事背景很有意思 所以我就做了一下
///循环链表实现
#include<iostream>
using namespace std;
typedef struct node{
int data;
node *next;/// struct
}node;
node *createlist(int n){
if(n<1){
cout << "Error!" << endl;
return NULL;
}
node *head = new node;
node *p;
head->data = 1;
p = head;
for(int i=1; i<n; i++){
node *s = new node;
s->data = i+1;
p->next = s;
s->next = head;
p = s;
}
return head;
}
node *removelist(node *p){
node *next = p->next;
delete p;
return next;
}
int joseph(int n, int beg, int loop){
if(beg > n){
cout << "start can't be bigger than number\n";
return -1;
}
if(loop < 1){
cout << "loop at least is 1\n";
return -1;
}
node *one = createlist(n);
node *p = one;
for(int i=1; i<beg; i++){
p = p->next;
}
while(p->next!=p){
for(int j=1; j<=loop-2; j++){
p = p->next;
}
node *s = p->next;
p ->next = s->next;
p = s->next;
delete s;
}
return p->data;
}
int main(int argc, char const *argv[]) {
int c = joseph(10, 1, 3);
cout << c << endl;
return 0;
}
#include<iostream>
using namespace std;
typedef struct node{
int data;
node *next;/// struct
}node;
node *createlist(int n){
if(n<1){
cout << "Error!" << endl;
return NULL;
}
node *head = new node;
node *p;
head->data = 1;
p = head;
for(int i=1; i<n; i++){
node *s = new node;
s->data = i+1;
p->next = s;
s->next = head;
p = s;
}
return head;
}
node *removelist(node *p){
node *next = p->next;
delete p;
return next;
}
int joseph(int n, int beg, int loop){
if(beg > n){
cout << "start can't be bigger than number\n";
return -1;
}
if(loop < 1){
cout << "loop at least is 1\n";
return -1;
}
node *one = createlist(n);
node *p = one;
for(int i=1; i<beg; i++){
p = p->next;
}
while(p->next!=p){
for(int j=1; j<=loop-2; j++){/// 比如 1 2 3 这三个人中间只间隔一个人 所以减2
p = p->next;
}
node *s = p->next;
p ->next = s->next;
p = removelist(s);
}
return p->data;
}
int main(int argc, char const *argv[]) {
int c = joseph(10, 1, 3);
cout << c << endl;
return 0;
}