链表经典问题——猴子选大王

n只猴子要选大王,选举方法如下:所有猴子按 12 ……… n 编号并按照顺序围成一圈,从第 1个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。

#include<malloc.h>
#include<iostream>
using namespace std;
typedef struct snode
{
	int data;
	struct snode *next;
}lnode;
void houzi(int n,int k)
{
	lnode *p,*lq,*head,*s,*pre;		//p:当前结点。 head :头结点 。pre:当前结点前一个结点。
	head=(lnode *)malloc(sizeof(lnode));
	head->next=head;
	head->data=0;
	p=head;
	p->data=1;
	p->next=p;
	
	for(int i=2;i<=n;i++)
	{
		lq=(lnode *)malloc(sizeof(lnode));
		lq->data=i;
		lq->next=p->next;
		p->next=lq;
		p=p->next;
	}
	p=head;
	pre=head;
	while(n!=1)
	{
		for(int i=1;i<k;i++)
		{
			p=p->next;
			cout<<p->data<<" ";
		}
		cout<<endl<<p->data<<"出局"<<endl;
		while(pre->next!=p)				//确定删除结点的前一个节点,以便删除。
			pre=pre->next;
		pre->next=p->next;
		s=p;
		p=p->next;
		free(s);
		n--;
	}
	cout<<"最后的结点为:"<<p->data<<endl;
}
int main()
{
	houzi(8,3);
}





约瑟夫问题。

解决方法:建立一个有n个节点,没有头结点的循环链表,确定第一个报数人的位置。不断从链表中删除节点,直到链表为空。

还需要搞定的:单链表反转,对单链表遍历一次求中间值。先记下。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值