2017-08-13 96 views
1

我正試圖編寫一個從鏈接列表中刪除所有pdf文件的函數,但是在運行後,我很快意識到它變成了一個無限循環。我的第一個while循環應該在鏈表的開頭捕捉所有的pdf文件。我的第二個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 

我得到的是沒有類型未標化的第二個while循環,它混淆了我,因爲它應該停止時,PTR [「未來」]是無誤差。

我的鏈接列表如下:

{'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

你永遠不會在第二個循環中推進'ptr'。我也沒有得到'while all_removed'循環。此外,該功能的返回值應該是什麼?另外,你如何處理第一個元素應該被刪除的情況?你只需要替換你的'lst'引用,但是這不會更新調用者的'lst'實例。 – poke

+0

現在我返回了lst,如果你完全忽略了第二個循環,那麼返回值不會返回調用者的lst,而是返回lst的新實例。 – DrJessop

+0

@ poke我試圖用while循環做什麼,如果循環遇到pdf,在迭代結束時,它應該再次迭代,以確保它不會遺漏任何pdf。這是因爲如果有兩個相鄰的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']!= None下標的。爲什麼是這樣呢,因爲當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文件。