Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中删除链表中的节点_Python_Search_Linked List - Fatal编程技术网

在python中删除链表中的节点

在python中删除链表中的节点,python,search,linked-list,Python,Search,Linked List,要删除链接列表中的节点,此实现有什么问题吗 def delete(self, val): tmp = self.head prev = None while tmp: if val == tmp.data: self.size -= 1 if prev==None: self.head = self.head.next else:

要删除链接列表中的节点,此实现有什么问题吗

def delete(self, val):
    tmp = self.head
    prev = None
    while tmp: 
        if val == tmp.data:
            self.size -= 1
            if prev==None: 
                self.head = self.head.next 
            else:
                prev.next = tmp.next 
        else:
            prev = tmp
            tmp = tmp.next 
我看过的所有指南都说应该是:

def delete(self, data):
    tmp = self.head
    prev = None
    found = False 
    while tmp and not found:
        if data == tmp.data:
            found = True
        else:
            prev = tmp
            tmp = tmp.next
    if found:
        self.size -= 1
        if prev == None:
            self.head = self.head.next
        else:
            prev.next = tmp.next
但是我不明白为什么需要这个发现。为什么认为这是必要的?为什么这个实现更正确

此外,我在搜索方面也有同样的问题:

我的实施是:

def __contains__(self, data):
    tmp = self.head
    while tmp:
        if data == tmp.data:
            return True 
        else: 
            tmp = tmp.next
    return False 
但正确的实施方式是:

def __contains__(self, data):
        tmp = self.head
        found = False
        while tmp and not found:
            if data == tmp.data:
                found = True
            else: 
                tmp = tmp.next
        return found 

只要数据是唯一的,
delete
s就相同。因此,通常更好的做法是,在列表中进行单独的循环,而不是处理元素。它更具可读性,嵌套更少。如果未找到
数据
,则最好给出一个错误:

def delete(self, data):
    tmp = self.head
    prev = None
    while tmp:
        if data == tmp.data:
            break
        prev = tmp
        tmp = tmp.next
    else:
        raise ValueError('data not found')
    self.size -= 1
    if prev is None:
        self.head = tmp.next
    else:
        prev.next = tmp.next

嗯,你的删除看起来不错。它工作不正常吗?基本上,您只需将代码从if中剪切出来,并在条件为true时将其放入,这很好。另外,我认为如果发现了指南实现,应该再标记一次。Looks ErrorFound用于在某个节点退出循环。@CurlyJoe:Ohh,这很有意义。那搜索呢?对于搜索,我也退出了——我确信我的实现更好,因为它更简洁,但我觉得我遗漏了一些明显的东西。@想到了
head.next
prev.next
,但这是毫无意义的。