前面学数据结构一直卡着 今年重新学 为了不半途而废 决定每天来这里发布总结 让自己坚持下去
#include<bits/stdc++.h> //万能头文件
using namespace std;
struct node{ //单向链表的必备data和next
int data;
node * next;
};
int main(){
int n,m;
cin>>n>>m;
node *head=new node; //创建头结点
head->data=1; //给data和next赋值
head->next=nullptr;
node *now=head; //这时创建当前结点 把头结点赋值给他
for(int i=2;i<=n;i++){ //创建约瑟夫链表 从1-n的
node *p=new node; //当前的now里面只有一个head 并不能now=now->next 所以就要new 一个新
的结点得到data和next 再赋值给now 使now 更新
p->data=i;
p->next=nullptr;
now->next=p; // now指向p 得到p的地址 p就加入到了链表中
now=p; //p再赋值给now now现在就是p了
}
now->next=head; //最后再指向head 首位相连 约瑟夫问题就轻轻松松
now=head; //从头开始
node *pre=nullptr; //再创建一个指针 是为了保存当前的now 当now要被删除时 就得进位
while(n>0){
for(int i=1;i<m;i++){ 下面会搞个例子解释 pre的作用
pre=now;
now=now->next;
}
cout<<now->data<<" ";
pre->next=now->next;
delete now;
now=pre->next;
m--;
}
return 0;
}
pre的解释
假如m=2 第一次时 now=1 pre=null;
进入第一个循环 pre=1 now=2 直接退出
输出2 pre->next=now->next 等于 pre->next=2->next(3) pre->next就得到了3的地址 就直接
省略了2这个位置 链表里面就相当于没了2 我们再delete就实实在在没有了 再now=pre->next now现在就是从3开始了 接着下一个循环
如理解有错 忘网友纠正 谢谢