实现以及解决约瑟夫问题
约瑟夫环: baike.baidu.com/item/%E7%BA… 感觉这个问题应该有公式的,可以o(1)解决问题
class Node:
def __init__(self, data):
self.data = data
self.next = Node
class RingList:
def __init__(self, data=None):
self.head = Node(data) if data else None
self.tail = Node(data) if data else None
self.length = 1 if data else 0
def add_data(self, data):
node = Node(data)
# 没有定义头结点
if not self.head:
self.head = node
self.tail = node
self.tail.next = self.head
else:
self.tail.next = node
node.next = self.head
self.tail = node
self.length += 1
def print_list(self):
tempNode = self.head
for _ in range(self.length):
print(tempNode.data, end="->")
tempNode = tempNode.next
print()
def left(self, start=1, interval=2):
if start > self.length:
print(f"start必须在1到{self.length}之间")
return
if interval < 2:
print("interval的值必须大于2")
return
tempNode = self.head
for _ in range(start - 1):
tempNode = tempNode.next
print("起始数字是:", tempNode.data)
count = 0
while self.length != 1:
count += 1
for _ in range(interval - 2):
# 找到要去除node的前一个node
tempNode = tempNode.next
print(f"第{count}轮,本次淘汰的是{tempNode.next.data},下一轮起始数字{tempNode.next.next.data}")
temp = tempNode.next.next
tempNode.next = temp
tempNode = temp
self.length -= 1
print("删除后列表:", end=" ")
self.print_list()
print(f"剩下的数字是{tempNode.data}")
rl = RingList()
rl.add_data(1)
rl.add_data(2)
rl.add_data(3)
rl.add_data(4)
rl.add_data(5)
rl.add_data(6)
tempNode = rl.head
rl.left(3, 3)
rl.left(2, 2)