python环形链表

参考:www.bilibili.com/video/BV1E4…

实现以及解决约瑟夫问题

约瑟夫环: 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)