在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
,但这是毫无意义的。