鍊錶解決環問題,Python實現

2021-09-26 13:23:26 字數 2234 閱讀 8242

問題描述:

假設有n個人圍坐一圈,現在要求從第k個人開始報數,報到第m個數的人出列,然後從下乙個人繼續開始以同樣的方法報數,直到所有的人都出列為止,要求按順序輸出各出列的人的編號。

演算法設計:

1)建立包含指定節點的迴圈鍊錶,可以先建立乙個空表,然後再尾部逐漸加入元素。

2)迴圈計數,找到並刪除應該退出的節點。

**實現:

#首先定義乙個結點類

class

lnode

:def

__init__

(self,elem,next_=

none):

self.elem=elem

self.

next

=next_

#再定義乙個迴圈鍊錶類

class

lclist

:#初始化尾結點

def__init__

(self)

: self._rear=

none

#判斷是否為空

defis_empty

(self)

:return self._rear is

none

#從前端插入資料

defprepend

(self,elem)

: p=lnode(elem)

if self._rear is

none

: p.

next

=p self._rear=p

else

: p.

next

=self._rear.

next

self._rear.

next

=p #從尾端插入

def(self,elem)

: self.prepend(elem)

self._rear=self._rear.

next

#從前端彈出元素

defpop

(self)

:if self._rear is

none

:raise valuerror(

'in pop of cllist'

) p=self._rear.

next

if self._rear is p:

self._rear=

none

else

: self.rear.

next

=p.next

return p.elem

#輸出所有表元素

defprintall

(self)

:if self.is_empty():

return

p=self._rear.

next

while p is

not self._rear:

print

(p.elem)

p=p.

next

#定義約瑟夫環類,繼承自迴圈鍊錶類

class

josephus

(lclist)

:#定義乙個新方法用於實現結點環的迴圈

defturn

(self,m)

:for i in

range

(m):

self._rear=self._rear.

next

def__init__

(self,n,k,m)

:super()

.__init__(

)for i in

range

(n):1)

#從第k個人開始報數,將此元素移動到表頭

self.turn(k-1)

#開始迴圈報數

while

not self.is_empty():

self.turn(m-1)

#把報數到m人移動到表頭

p=self.pop(

)print

(p,end=

'\n'

if self.is_empty(

)else

', '

)

迴圈鍊錶解決約瑟夫環問題

題目要求的約瑟夫環操作 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...

使用鍊錶解決約瑟夫環問題

1139 約瑟夫環問題 時間限制 500ms 記憶體限制 65536k 提交次數 157 通過次數 79 題型 程式設計題 語言 g gcc description 約瑟夫 josephus 環是這樣的 假設有n個小孩圍坐成乙個圓圈,並從1開始依次給每個小孩編上號碼。老師指定從第s位小孩起從1開始報...

迴圈鍊錶解決約瑟夫環問題

問題描述 假設有n個小孩按照序號1,2,n圍坐成一圈,從第乙個小孩開始報數,每次報到n的人退出,接著從下乙個人重新開始從1開始報數,下一次再報到n的人退出,求最後乙個留下的人 小孩的個數n,和報數的n由鍵盤輸入 輸出留下人的序號 乙個迴圈鍊錶都寫得除出了很多問題,改了半天才出來 include in...