2017-08-13 95 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文件。