约瑟夫环,有n个人围成一圈(编号为1~n),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的位置是多少号? 输入格式: 测试数据有多组,处理到文件尾。每组测试输入一个整数n(5≤n≤100)。 输出格式: 对于每组测试,输出最后剩下那个人的编号。输出结果。若本题作为链表实验题,则要求采用自定义单链表或循环单链表求解。
时间: 2024-03-05 08:51:35 浏览: 62
我们可以使用循环链表来模拟约瑟夫环的过程。我们可以先构建一个长度为n的循环单链表,然后在循环中不断执行报数的过程,即将当前节点的下一个节点删除,直到只剩下一个节点。
以下是实现代码:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
while True:
try:
n = int(input())
except:
break
# 构建循环单链表
head = ListNode(1)
p = head
for i in range(2, n+1):
p.next = ListNode(i)
p = p.next
p.next = head
# 报数过程
p = head
while p.next != p:
p.next = p.next.next.next
p = p.next
print(p.val)
```
我们首先构建一个长度为n的循环单链表,然后在循环中不断执行报数的过程,即将当前节点的下一个节点删除,直到只剩下一个节点。删除节点的方法是将当前节点的下一个节点指向下下个节点,即`p.next = p.next.next.next`。需要注意的是,删除节点后,当前节点不需要移动,因为下一个节点已经变成了当前节点的下一个节点。
最后,当只剩下一个节点时,即为原来的位置。
阅读全文