环形链表和约瑟夫问题 [Java][数据结构]

环形链表和约瑟夫问题

约瑟夫问题(josephu):

假设这个时候编号为1,2,3,4 ,… , n的n个人围坐在一圈,约定编号为k的人开始从1报数,数到m的人就出列,然后从出列的人的的下一个位置开始继续从1报数,数到m的人继续出列,一直这样循环执行,直到所有人出列为止 , 由此产生一个出队编号序列 —> 这个问题就是约瑟夫问题

  • 我们使用一个单项环形链表就可以解决约瑟夫问题:

单向环形链表:

从一个节点开始指向下一个节点,知道指向第n个结点之后这个第n个结点又重新指向我们的第一个节点,这样的链表我们就称之为一个单向环形链表,具体的说是一个长度为n的单向环形链表

  • 如果单向循环链表中只有一个节点,这个时候这一个节点也要形成一个环 , 也就是这个节点的next域指向自身

那么我们如何使用单向环形链表来解决约瑟夫问题:

我们比如是一个有n个孩子的约瑟夫问题, 这个时候我们只需要创建一个长度为n的单向环形链表,这个单向环形链表中的n个结点就是代表着n个孩子,假设这个时候我们要报数报到3的人出列,那么我们只需要让链表从1开始 , 就相当于是第一个节点报数为1,然后第二个节点报数,报数为2,然后第三个结点开始报数,报数为3,这个时候第三个结点报数之后就要出列,也就是要将这个节点从我们的单行环形链表中删除掉,删除之后从刚刚删除的结点的下一个节点位置又开始报数,等到报数到3之后又将这个节点删除掉,然后一直循环执行,知道我们的单向环形链表中只有一个节点为止,但是这个时候注意: 最后单向环形链表中剩余一个节点的时候这一个节点也还是要出列,也就是最终单向环形链表中要是一个节点都没有,那么就是结束了循环,那么也就是结束了,那么刚刚删除结点的顺序就是我们的约瑟夫问题的答案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值