2017-08-13 16 views
1

リンクリストからすべてのpdfファイルを削除する関数を作成しようとしていますが、これを実行した後、無限ループになったことをすぐに認識しました。私の最初のwhileループは、リンクされたリストの先頭にあるすべてのpdfファイルを捕まえることになっています。私の2番目のwhileループは、pdfファイルを取り除くのに必要な回数だけ、リンクされたリストを繰り返し処理することになっています。私はループではない間に自分のロジックが間違っていると思います。リンクリストを繰り返すときの無限ループPython 3

def remove_all(lst): 
    ptr = lst 
    while ptr['data'][0] == 'pdf': 
     ptr = ptr['next'] 
     lst = ptr 
    all_removed = True 
    while not all_removed: 
     all_removed = False 
     while ptr['next'] != None: 
      if ptr['next']['data'][0] == 'pdf': 
       ptr['next'] = ptr['next']['next'] 
       all_removed = True 
      ptr = ptr['next'] 
    return lst 

私はPTR [「の次は」] Noneのときに停止することになっているので、私を混乱なしタイプがループしながら、第二のために添字化されていないというエラーが発生し、取得しています。

マイリンクリストは、次のようになります。

{'data': ['pdf', 2, 4], 'next': {'data': ['csv', 1, 1], 'next': {'data': ['pdf', 234, 53], 'next': 
{'data': ['xml', 1, 2], 'next': {'data': ['pdf', 0, 1], 'next': None}}}}} 
+0

2番目のループで 'ptr'を進めることはありません。私はまた、 'all_removedではないwhileループ 'を取得しません。また、その関数の戻り値は何ですか?また、最初の要素を削除する必要があるケースをどのように処理しますか? 'lst'リファレンスを置き換えるだけですが、これは呼び出し元の' lst'インスタンスを更新しません。 – poke

+0

これで最初に返されたので、2番目のループを完全に無視すると、戻り値は呼び出し元のlstを返すのではなく、lstの新しいインスタンスを返します。 – DrJessop

+0

@ poke私がwhileループでやろうとしていることは、ループがpdfに遭遇した場合です。繰り返しの最後に、それがpdfを見落とさなかったことを確認するために再度繰り返す必要があります。これは、隣接する2つのpdfファイルがある場合、ptr ['next'] = ptr ['next'] ['next']がptr ['next']をpdfファイルにすることができるからです。 – DrJessop

答えて

1

まず、試してみてください。代わりに

ptr['next'] = ptr['next']['next'] 

ptr['next'] == ptr['next']['next'] 

第二に、私たちはあなたの構造で'next': {'data': ['xml', 1, 2]を持っているので( xmlcsv - pdfではありません)、exec utionは、ネストされたwhileループに入る:

while ptr['next'] != None:

と条件if ptr['next']['data'][0] == 'pdf':Falseと評価された場合、それが無限ループで立ち往生以来。

+0

私はちょうどいくつかの編集を行いましたが、現在は、ptr ['next']!=なしの間、どの型もsubscriptableではないというエラーが出ます。 ptr ['next'] = Noneのときループを繰り返すのを止めれば、なぜでしょうか。 – DrJessop

+0

また、not_all_removed = Falseのときに、最初のループがリンクされたリスト全体を介して開始するようにするにはどうすればよいでしょうか? – DrJessop

+0

@DrJessop 'not_all_removed == False'のとき、ループ状態はTrueと評価され、再び実行されます。 'ptr'は既にリストの先頭を指しています。 – alfasin

0

私が完全に理解していないとすれば、真のループの間に私は私の質問に答えるために再帰に頼った。

def remove(lst): 
    ptr=lst 
    while ptr['data'][0]=='pdf': 
     ptr=ptr['next'] 
     lst=ptr 
    while ptr['next']!=None: 
     if ptr['next']['data'][0]=='pdf': 
      ptr['next']=ptr['next']['next'] 
      return remove(lst) 
     ptr=ptr['next'] 
    return lst 

リストの開始時に任意のPDFファイルのがある場合、それらは削除され、その後、存在する場合は任意のPDFの遭遇後に、彼らは削除され、関数は隣接のpdfのある念のために自身を返します。

関連する問題