【问题标题】:Deleting a node in Linked List in python在python中删除链接列表中的节点
【发布时间】:2015-11-14 11:28:15
【问题描述】:

要删除链表中的一个节点,这个实现有什么问题?:

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 

【问题讨论】:

  • 嗯,你的删除看起来不错。它工作不正常吗?本质上,您只需从 if 中删除代码并将其放入 if 条件为 true 即可。另外,我认为如果找到指南实施,应该再标记一次。看起来不对
  • found 用于在某个节点退出循环。
  • @CurlyJoe:哦,这很有意义。但是 search 呢?对于搜索,我也退出了——我确信我的实现更好,因为它更简洁,但我觉得我错过了一些明显的东西。

标签: python search linked-list


【解决方案1】:

只要数据是唯一的,deletes 就是相同的。所以通常更好的是,在列表中进行单独的循环,而不是处理元素。它更具可读性,并且嵌套更少。如果没有找到data,最好给出一个错误:

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

【讨论】:

  • @thought of head.nextprev.next,但这是无意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多