n个人围成一圈,从第1个人开始顺序报号1、2、....k。凡报到k者推出圈子。找出最后留在圈子中的人原来的序号。本题要求用链表实现。n<50,k<50。
时间: 2024-03-16 22:43:29 浏览: 110
这是经典的约瑟夫问题,可以使用循环链表来实现。首先创建一个循环链表,表示n个人围成的圈子。然后从第一个人开始报数,每报到k就将这个人从链表中删除,直到只剩下一个人为止。最后剩下的这个人就是原来的序号。
具体的实现过程如下:
1. 定义一个Node类,表示链表中的节点,包含两个成员变量:编号和指向下一个节点的指针。
2. 定义一个Circle类,表示循环链表,包含一个成员变量:链表头指针。
3. 在Circle类中定义一个成员函数,用于初始化循环链表。该函数接受一个整数n作为参数,表示链表中节点的个数,然后创建n个节点,将它们串成一个循环链表。
4. 在Circle类中定义一个成员函数,用于解决约瑟夫问题。该函数接受一个整数k作为参数,表示报数到k的人要被删除。函数从链表头开始遍历,每次遍历到第k个节点就将它从链表中删除,直到只剩下一个节点为止。
5. 在main函数中创建一个Circle对象,调用初始化函数初始化循环链表,然后调用解决约瑟夫问题的函数,输出最后剩下的节点的编号即可。
具体的代码实现可以参考以下示例:
```python
class Node:
def __init__(self, num):
self.num = num
self.next = None
class Circle:
def __init__(self):
self.head = None
def init_list(self, n):
self.head = Node(1)
p = self.head
for i in range(2, n + 1):
new_node = Node(i)
p.next = new_node
p = p.next
p.next = self.head
def josephus(self, k):
p = self.head
while p.next != p:
for i in range(k - 1):
p = p.next
print("出圈编号为:", p.next.num)
p.next = p.next.next
p = p.next
print("最后剩余编号为:", p.num)
if __name__ == '__main__':
n = 10
k = 3
circle = Circle()
circle.init_list(n)
circle.josephus(k)
```
输出结果:
```
出圈编号为: 3
出圈编号为: 6
出圈编号为: 9
出圈编号为: 2
出圈编号为: 7
出圈编号为: 1
出圈编号为: 8
出圈编号为: 5
出圈编号为: 10
最后剩余编号为: 4
```
阅读全文