python环形单链表的约瑟夫问题详解

  

<强>题目:
  

  

一个环形单链表,从头结点开始向后,指针每移动一个结点,就计数加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   返回p

python环形单链表的约瑟夫问题详解