算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。
开始理解错题目,但是创建双向链表的思路可行。
#include<iostream>
#include <stdlib.h>
using namespace std;
//双向循环链表
typedef int datatype;
//方便修改
//当然也可以写成模板来适应更多的数据类型
struct dclist{
datatype data;//数据定义
struct dclist *prior;
struct dclist *next;//前驱和后继指针
};
class Joseph {
public:
int getResult(int n, int m) {
dclist *L = (struct dclist*)malloc(sizeof(struct dclist));
L->next = L->prior = NULL;
dclist *r = L;
dclist *p;
for (int i = 1; i <= n; i++){
p = (struct dclist*)malloc(sizeof(struct dclist));
p->data = i;
p->prior = r;
p->next = r->next;
r->next = p;
r = p;
}
r->next = L->next;
L->next->prior = r;
if (m>0)
do{
L = L->next;
} while (--m);
int t = L->data;
return t;
}
};
int main(){
int n, m;
cin >> n >> m;
Joseph tlist;
int t = tlist.getResult(n, m);
cout << t;
}
后面的是正确答案
#include<iostream>
#include <stdlib.h>
using namespace std;
//双向循环链表
typedef int datatype;
//方便修改
//当然也可以写成模板来适应更多的数据类型
struct dclist{
datatype data;//数据定义
struct dclist *prior;
struct dclist *next;//前驱和后继指针
};
class Joseph {
public:
int getResult(int n, int m) {
dclist *L = (struct dclist*)malloc(sizeof(struct dclist));
L->next = L->prior = NULL;
dclist *r = L;
dclist *p;
for (int i = 1; i <= n; i++){
p = (struct dclist*)malloc(sizeof(struct dclist));
p->data = i;
p->prior = r;
p->next = r->next;
r->next = p;
r = p;
}
r->next = L->next;
L->next->prior = r;
//删除操作
while (L->next != L){
for (int k = 1; k < m; k++) //因为要保留L,删除p结点,所以这里循环m-1次
L = L->next;
p = L->next;
L->next = p->next;
free(p);//删除p
}
//
int t = L->data;
return t;
}
};
int main(){
int n, m;
cin >> n >> m;
Joseph tlist;
int t = tlist.getResult(n, m);
cout << t;
}