迭代链接列表Python 3时的无限循环

时间:2017-08-13 18:14:02

标签: python-3.x while-loop linked-list

我正在尝试编写一个从链表中删除所有pdf文件的函数,但是在运行之后,我很快意识到它变成了一个无限循环。我的第一个while循环应该捕获链表开头的所有pdf文件。我的第二个while循环应该遍历链表,多次遍历pdf文件。我想我的逻辑虽然不是循环不正确。

List<City> filtered_events = new ArrayList<>();
    if (filtered_categories.size() > 0) {
            for (String c : filtered_categories) {

                for (City city: events) {
                    if (c.equalsIgnoreCase(city.getCat_id())) {
                        filtered_events.add(city);
                    }
                }
            }
        }

        if (filtered_cities.size() > 0) {
            for (String c : filtered_cities) {

                for (City city: events) {
                    if (c.equalsIgnoreCase(city.getCity_id())) {
                        filtered_events.add(city);
                    }
                }
            }
        }

我得到的错误是第二个while循环没有类型不可订阅,这让我感到困惑,因为它应该在ptr ['next']为None时停止。

我的链接列表如下所示:

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

2 个答案:

答案 0 :(得分:1)

首先,试试:

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

而不是:

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

其次,由于我们的结构中有'next': {'data': ['xml', 1, 2]xmlcsv - 而不是pdf),执行会进入嵌套的while循环:

while ptr['next'] != None:

并且由于if条件if ptr['next']['data'][0] == 'pdf':的计算结果为False,它会无限地陷入循环。

答案 1 :(得分: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&#39; s。