问题描述
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
算法思路
- 用环形链表去构造数据结构
- 每逢9的倍数,将该链表删除,指针指向下一个数字
核心代码
# 首先构造环形链表,这个很基本不多说
# 删除链表操作
while remain_people != 15:
for ii in range(1,8): # 前7次运动是没有任何问题的
ptr = ptr.next
else: # 第8次运动,需要跳过第9个数,并将其删除
# 打印9号链表
print(ptr,'{}号下船了'.format(ptr.next.name))
# 删除9号链表(同时跳过这个数)
ptr.next = ptr.next.next
remain_people -= 1
# 指针向前运动一次
ptr = ptr.next