ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

约瑟夫环

2022-01-31 17:31:09  阅读:135  来源: 互联网

标签:__ None tmpPreNode NextNode 约瑟夫 header curNode


基于python的约瑟夫环

思路一:递归

# 约瑟夫环:递归
def KillYuesefu(n,m):
    if(n == 1):
        return 0
    return (KillYuesefu(n - 1, m) + m ) % n 
    
def main():
    for num in range(1,11):
        lastindex=KillYuesefu(num,8)+1
        print(lastindex)

if __name__ == "__main__":
    main()

  

思路二:单向链表

# 约瑟夫环:单向循环链表

class Node:
    def __init__(self,Id,NextNode):
        self.Id=Id
        self.NextNode=NextNode



def GenerateNodeLinkList(listLen):
    header = Node(1,None)
    tmpPreNode = header
    if(listLen < 1 ):
        return None
    elif listLen>1:
        for i in range(2,listLen):
            tmpNode = Node(i,None)
            tmpPreNode.NextNode=tmpNode
            tmpPreNode=tmpNode
    return header

def GenerateNodeLinkList_Yuesefu(n):
    # 初始化链表
    header = Node(1,None)
    tmpPreNode = header
    if(n < 1 ):
        return None
    elif n > 1:
        for i in range(2 , n+1):
            tmpNode = Node(i,None)
            tmpPreNode.NextNode=tmpNode
            tmpPreNode=tmpNode
    tmpPreNode.NextNode=header

    return header


def KillYuesefu(nodelist,m):
    curIndex=1
    curNode=nodelist
    preNode=None
    
    while(curNode!=preNode):
        if curIndex==m:
            # 杀死当前节点
            print("%d" % (curNode.Id),end=" --> ")
            curNode=curNode.NextNode
            preNode.NextNode=curNode
            curIndex=1
        else:
            curIndex=curIndex+1
            preNode=curNode
            if curNode.NextNode is not None:
                curNode=curNode.NextNode
            else:
                break
    print("alive %d" % curNode.Id,end=" ")
    print("OVER")


def main(): 
    for num in range(1,11):
        print("begin num is %d" % num)
        nodelist=GenerateNodeLinkList_Yuesefu(num)
        KillYuesefu(nodelist,8)


if __name__ == "__main__":
    main()

  

思路三:双向链表

# 约瑟夫环:双向循环链表

class Node:
    def __init__(self,Id,Name,PreNode,NextNode):
        self.Id=Id
        self.Name=Name
        self.PreNode=PreNode
        self.NextNode=NextNode



def GenerateNodeLinkList(listLen):
    header = Node(1,"Name1",None,None)
    tmpPreNode = header
    if(listLen < 1 ):
        return None
    elif listLen>1:
        for i in range(2,listLen):
            tmpNode = Node(i,"Name-%d" % i,tmpPreNode,None)
            tmpPreNode.NextNode=tmpNode
            tmpPreNode=tmpNode
    return header

def GenerateNodeLinkList_Yuesefu(n):
    # 初始化链表
    header = Node(1,"Name1",None,None)
    tmpPreNode = header
    if(n < 1 ):
        return None
    elif n > 1:
        for i in range(2 , n):
            tmpNode = Node(i,"Name-%d" % i,tmpPreNode,None)
            tmpPreNode.NextNode=tmpNode
            tmpPreNode=tmpNode
    tmpPreNode.NextNode=header
    header.PreNode=tmpPreNode

    return header


def KillYuesefu(nodelist,m):
    curIndex=1
    curNode=nodelist
    
    while(curNode is not None):
        if curIndex==m:
            # 杀死当前节点
            print("Id=%d,Name=%s" % (curNode.Id,curNode.Name),end=" --> ")
            tmp = curNode.PreNode
            if tmp is None:
                # 前面没有节点了,结束
                break
            curNode=curNode.NextNode
            if tmp==curNode:
                # 重叠,结束
                break
            tmp.NextNode=curNode
            curNode.PreNode=tmp
            curIndex=1
        else:
            curIndex=curIndex+1
            curNode=curNode.NextNode
    print("OVER")

def main():
    nodelist=GenerateNodeLinkList_Yuesefu(10)
    KillYuesefu(nodelist,6)

if __name__ == "__main__":
    main()

  

标签:__,None,tmpPreNode,NextNode,约瑟夫,header,curNode
来源: https://www.cnblogs.com/lijunhao/p/15858437.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有