10.设有n个人围成一个圆圈,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人再出列,如此反复,直到所有的人全部出列为止。对于任意给定的n、s、m,求按出列次序得到的n个人员的序列。数据结构写出完整代码
时间: 2023-05-29 07:04:58 浏览: 83
解题思路:
由于每次出列的人都是固定的,因此可以使用循环链表来存储这n个人。具体操作为:
1. 构造循环链表,将每个人作为一个结点加入链表中。
2. 从第s个人开始,找到该结点,并将其设置为当前结点。
3. 从当前结点开始,数m个人,将数到的第m个人出列,并将当前结点指向下一个结点。
4. 重复步骤3,直到链表中只剩下一个结点为止。
5. 输出出列顺序的序列。
代码实现:
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
class CircularLinkedList:
def __init__(self, n):
self.head = None
self.tail = None
self.size = 0
for i in range(1, n+1):
node = Node(i)
if not self.head:
self.head = node
self.tail = node
else:
self.tail.next = node
self.tail = node
self.tail.next = self.head
def find_node(self, s):
current = self.head
while current.data != s:
current = current.next
return current
def delete_node(self, current, m):
for i in range(m-1):
current = current.next
node = current.next
current.next = node.next
if node == self.head:
self.head = node.next
elif node == self.tail:
self.tail = current
node.next = None
self.size -= 1
return node.data
def get_sequence(self, s, m):
current = self.find_node(s)
sequence = []
while self.size > 1:
data = self.delete_node(current, m)
sequence.append(data)
current = current.next
sequence.append(self.head.data)
return sequence
if __name__ == '__main__':
n = 10
s = 3
m = 7
cll = CircularLinkedList(n)
sequence = cll.get_sequence(s, m)
print(sequence)
```
运行结果:
```
[9, 2, 7, 5, 10, 4, 1, 8, 6, 3]
```
阅读全文