リンクリストからすべての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}}}}}
2番目のループで 'ptr'を進めることはありません。私はまた、 'all_removedではないwhileループ 'を取得しません。また、その関数の戻り値は何ですか?また、最初の要素を削除する必要があるケースをどのように処理しますか? 'lst'リファレンスを置き換えるだけですが、これは呼び出し元の' lst'インスタンスを更新しません。 – poke
これで最初に返されたので、2番目のループを完全に無視すると、戻り値は呼び出し元のlstを返すのではなく、lstの新しいインスタンスを返します。 – DrJessop
@ poke私がwhileループでやろうとしていることは、ループがpdfに遭遇した場合です。繰り返しの最後に、それがpdfを見落とさなかったことを確認するために再度繰り返す必要があります。これは、隣接する2つのpdfファイルがある場合、ptr ['next'] = ptr ['next'] ['next']がptr ['next']をpdfファイルにすることができるからです。 – DrJessop