Python编程实现 有 n 个人排队,1号排在 2号前面,2号排在 3号前面,...,以此类推 n-1号排在 n 号前面。在这个过程中,偶尔老师会把某个人叫走,叫走之后这个人就离开了队伍,假设本来 a 排在 b 前面,b 排在 cc前面,b被叫走后 a 就排在了 c前面。老师偶尔也会感到疑问,她想知道此时排在 a 号前面的同学是几号呢? 已知老师一共会有 k次操作,每次会执行下面的一种: 1.1. 把 x 叫走。 2.2. 求排在 x 前面的是谁。
时间: 2023-02-07 20:13:26 浏览: 152
首先,我们可以使用链表来实现这个队伍,每个节点代表一个人。对于每个节点,我们需要记录这个人的编号以及前驱后继节点的引用。
我们需要实现以下功能:
- 叫走 x 号同学,即删除 x 号同学所在的节点。
- 求出 x 号同学前面的同学的编号。
那么我们就可以写出以下代码:
```python
class Node:
def __init__(self, val):
self.val = val
self.prev = None
self.next = None
class LinkedList:
def __init__(self):
self.head = None
self.tail = None
self.size = 0
def add_node(self, val):
# 在链表末尾添加一个节点
new_node = Node(val)
if self.head is None:
self.head = new_node
self.tail = new_node
else:
self.tail.next = new_node
new_node.prev = self.tail
self.tail = new_node
self.size += 1
def delete_node(self, node):
# 删除节点
if self.size == 0:
return
if self.head == self.tail:
self.head = None
self.tail = None
elif self.head == node:
self.head = node.next
node.next.prev = None
elif self.tail == node:
self.tail = node.prev
node.prev.next = None
else:
node.prev.next = node.next
node.next.prev = node.prev
self.size -= 1
def find_node(self, val):
# 查找节点
curr = self.head
while curr is not None:
if curr.val == val:
return curr
curr = curr.next
return None
def find_prev(self, val):
# 查找排在 val 前面的节点
node = self.find_node(val)
if node is not None:
return node.prev
return None
```
我们
阅读全文