西南科技大学 SWUSTOJ #956

大家好啊,我又来啦,这期和我一起来的还有咱们的来自西南科技大学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);
}

好啦,这篇文章就到这里为止啦,我们下一篇再见。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值