<强>题目:强>
一个环形单链表,从头结点开始向后,指针每移动一个结点,就计数加1,当数到第m个节点时,就把该结点删除,然后继续从下一个节点开始从1计数,循环往复,直到环形单链表中只剩下了一个结,点返回该结点。
这个问题就是著名的约瑟夫问题。
<强>代码:强>
首先给出环形单链表的数据结构:
类节点(对象): def __init__(自我价值,未来=0): 自我。值=https://www.yisu.com/zixun/value 自我。明年=#指针 类RingLinkedList(对象): #链表的数据结构 def __init__(自我): 自我。头=0 #头部 def __getitem__(自我,键): 如果self.is_empty (): 打印'Linked列表为空。 返回 elif关键& lt;0或关键比;self.get_length (): 打印“给定的关键是错误的。” 返回 其他: 返回self.get_elem(关键) def __setitem__(自我、关键值): 如果self.is_empty (): 打印链表是空的。 返回 elif关键& lt;0或关键比;self.get_length (): 打印“给定的关键是错误的。” 返回 其他: 回归自我。set_elem(关键字,值) def init_list(自我,数据):#按列表给出数据 自我。头=节点(数据[0]) p=自我。头#指针指向头结点 因为我在数据[1]: p。下一个=节点(i) #确定指针指向下一个结点 p=p。下一个#指针滑动向下一个位置 p。下一个=self.head def get_length(自我): p,长度=自我。头,0 而p !=0: 长度+=1 p=p.next 如果p==self.head: 打破 返回长度 def is_empty(自我): 如果自我。头==0: 还真 其他: 返回假 def insert_node(自我、索引值): 长度=self.get_length () 如果指数& lt;0或索引比;长度: 打印“不能将节点插入到链表。 elif指数==0: temp=self.head 自我。头=节点(价值、临时) p=self.head 在xrange(0,长度):_ p=p.next 打印“p。价值”,p.value p。下一个=self.head elif指数==长度: elem=self.get_elem(长度为1) 初步的。下一个=节点(值) elem.next。下一个=self.head 其他: p=自我。头,self.head 因为我在xrange(指数): 帖子=p p=p.next temp=p 职位。下一个=节点(价值、临时) def delete_node(自我,指数): 如果指数& lt;0或索引比;self.get_length () 1: 打印”错误的索引号删除任何节点。” elif self.is_empty (): 打印“不”节点可以删除。 elif指数==0: 尾=self.get_elem (self.get_length () (1) temp=self.head 自我。头=temp.next 尾巴。下一个=self.head elif指数==self.get_length () 1: p=self.head 因为我在xrange (self.get_length () 2): p=p.next p。下一个=self.head 其他: p=self.head 因为我在xrange(索引1): p=p.next p。下一个=p.next.next def show_linked_list(自我):#打印链表中的所有元素 如果self.is_empty (): 打印“这是一个空链表。” 其他: p=自我容器。头,[] _在xrange (self.get_length () 1): # container.append (p.value) p=p.next container.append (p.value) 印刷容器 def clear_linked_list(自我):#将链表置空 p=self.head _在xrange (0, self.get_length () 1): 帖子=p p=p.next 德尔后 自我。头=0 def get_elem(自我,指数): 如果self.is_empty (): 打印”链表是空的。得不到的元素。” elif指数& lt;0或索引比;self.get_length () 1: 打印”错误的任何元素索引号。” 其他: p=self.head 在xrange(指数):_ p=p.next 返回p def set_elem(自我、索引值): 如果self.is_empty (): 打印”链表是空的。不能设置元素。” elif指数& lt;0或索引比;self.get_length () 1: 打印”错误的索引号设置元素。” 其他: p=self.head 在xrange(指数):_ p=p.next p。值=https://www.yisu.com/zixun/value def get_index(自我价值): p=self.head 因为我在xrange (self.get_length ()): 如果p。价值==价值: 返回我 其他: p=p.next 返回1 >之前然后给出约瑟夫算法:
def josephus_kill_1(头,m): “‘ 环形单链表,使用RingLinkedList数据结构,约瑟夫问题。 :param头:给定一个环形单链表的头结点,和第m个节点被杀的死 返回:返回最终剩下的那个结点 本方法比较笨拙,就是按照规定的路子进行寻找,时间复杂度为o (m * len (ringlinkedlist)) “‘ 如果头==0: 打印”这是一个空的环链表。” 返回头 如果m & lt;2: 打印“错误的米数来玩这个游戏。” 返回头 p=头 而p。下一个!=p: _在xrange (0, m - 1): 帖子=p p=p.next #打印post.next.value 职位。下一个=post.next.next p=post.next 返回ppython环形单链表的约瑟夫问题详解