环形链表和约瑟夫问题
约瑟夫问题(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之后又将这个节点删除掉,然后一直循环执行,知道我们的单向环形链表中只有一个节点为止,但是这个时候注意: 最后单向环形链表中剩余一个节点的时候这一个节点也还是要出列,也就是最终单向环形链表中要是一个节点都没有,那么就是结束了循环,那么也就是结束了,那么刚刚删除结点的顺序就是我们的约瑟夫问题的答案