大家好啊,我又来啦,这期和我一起来的还有咱们的来自西南科技大学OJ956题的约瑟夫哟,老规矩,看题咯。
咱们先审题,哦,是要求我们不停的在1-10中循环,一到k这个数就将其删除,再次循环,直到最后一个数。
嗯,我们想想,啊,不用想了,题目已经告诉我们怎么做了,循环链表。
相信大家看到这的时候基本都对链表有个了解了,上题咱们说两个单链表链接,这题其实本质上差不多,只不过变成了自身首尾链接
明白了这一点就简单了,直接依葫芦画瓢,先创建单链表(写了这么多遍了,我感觉闭着眼都能写出来。)
typedef struct node{
int data;
node *next;
node *prev;
}node;
void creat(node *&L,int n){
node *p;
L=(node*)malloc(sizeof(node));
p=L;
L->next=NULL;
L->data=1;
for(int i = 2 ; i <= n ; i ++ ) {
node *s;
s=L;
while(s->next!=NULL){
s=s->next;
p=s;
}
s=(node*)malloc(sizeof(node));
p->next=s;
s->next=NULL;
s->data=i;
p=s;
}
p->next=L;//将尾结点链上头结点。
}
随后就是输出
void solve(node* &L,int n){
node *p,*q;
int sum=0;
p=L;
while(q->next!=L){
q=q->next;
}//这个的意义是让q指向p,也就是说q一只在p的前面,方便删除结点
while(p!=p->next){
sum++;
if(sum%n==0){
q->next=p->next;
node *s;
s=p;
p=p->next;
free(s);
}
else{
p=p->next;
q=q->next;
}
}
cout << p->data;
}
欧克,就是这么多啦,这就是循环链表,就是将头和尾链接在一起。
接下来是完整代码
#include <iostream>
using namespace std;
typedef struct node{
int data;
node *next;
node *prev;
}node;
void creat(node *&L,int n){
node *p;
L=(node*)malloc(sizeof(node));
p=L;
L->next=NULL;
L->data=1;
for(int i = 2 ; i <= n ; i ++ ) {
node *s;
s=L;
while(s->next!=NULL){
s=s->next;
p=s;
}
s=(node*)malloc(sizeof(node));
p->next=s;
s->next=NULL;
s->data=i;
p=s;
}
p->next=L;
}
void solve(node* &L,int n){
node *p,*q;
int sum=0;
p=L;
while(q->next!=L){
q=q->next;
}
while(p!=p->next){
sum++;
if(sum%n==0){
q->next=p->next;
node *s;
s=p;
p=p->next;
free(s);
}
else{
p=p->next;
q=q->next;
}
}
cout << p->data;
}
int main(){
int n,m;
cin >> n >> m;
node *L;
creat(L,n);
solve(L,m);
}
好啦,这篇文章就到这里为止啦,我们下一篇再见。