Circular linked list and Josephus ring

class ListNode:
    def __init__(self, data):
        self.data = data
        self.next = None
        
class CircleList:
    def __init__(self):
        self.head = None
    
    # add a node to the head
    def add(self, item):
        newNode = ListNode(item)
        if self.head is None:
            newNode.next = newNode
            self.head = newNode
        else:
            newNode.next = self.head.next
            self.head.next = newNode
    
    def next(self):
        self.head = self.head.next
    
    # delete the node at the head node
    def remove(self):
        curNode = self.head.next
        if curNode == self.head:
            self.head = None
        else:
            self.head.next = curNode.next
        return curNode
    
    def remove_item(self, item):  
        preNode = self.head
        curNode = self.head.next
        while curNode is not self.head and curNode.data != item:
            preNode = curNode
            curNode = curNode.next
        
        if curNode is self.head:
            self.head = self.head.next
        
        preNode.next = curNode.next
        
        return curNode.data
    
    def print_node(self):
        curNode = self.head
        while curNode.next != self.head:
            print curNode.next.data
            curNode = curNode.next
        print curNode.next.data # print the head node

# n people count m
def josephus(n, m): 
    # create n people list
    l = CircleList()
    for i in range(n, 0, -1):
        l.add(i) 

    for i in range(n - 1):  
        for j in range(m - 1):
            l.next()
        print 'The ',i, ' round deleted person is: ', l.remove().data
        
    print 'The winner is ', l.head.data
    #l.print_node()
                

def main():
    josephus(10, 4)


if __name__ == '__main__':
    main()
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值