Python 对于列表,我需要返回什么?对于edge case duplicate,我需要代码吗?

Python 对于列表,我需要返回什么?对于edge case duplicate,我需要代码吗?,python,linked-list,Python,Linked List,我有以下ListNode类: class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next 我编写以下代码的目的是从链接列表中删除任何重复项: def deleteDuplicates(self, head: ListNode) -> ListNode: if head == None: return

我有以下
ListNode
类:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
我编写以下代码的目的是从链接列表中删除任何重复项:

def deleteDuplicates(self, head: ListNode) -> ListNode:      
    if head == None: 
        return None 
    if head.next == None: 
        return head 
    curr = head 
    nex = head.next 
    while nex: 
        if head.val == nex.val: 
            curr.next = nex.next
        curr = nex.next
        nex = curr.next
问题:

  • 最后我该返回什么?是“头”还是“咖喱”还是别的什么?为什么?-我知道我希望输出是一个输入的链接列表,但删除重复项;那么返回链接列表的标题有意义吗?但是当我这样做时,我并没有得到预期的结果,即[1,1,2,2,3,3]>[1,2,3,3];这就引出了我的下一个问题

  • 当链表末尾有重复项时,我是否需要编写一个边缘案例?因为我不相信下面的代码能处理这个问题——我说的对吗


  • 我将假定您的列表总是经过排序的,因此任何重复项在列表中总是挨着一个

    while
    循环中存在两个问题:

  • 您应该比较两个相邻节点的值,但代码总是将下一个值与头部节点的值进行比较。因此,改变:

    if head.val == nex.val: 
    
    curr = nex.next
    

  • 您的代码正在通过执行
    curr=nex.next
    跳过节点。这意味着
    curr
    永远不会是
    nex
    。这也意味着下一条语句可能是无效引用,因为
    curr
    可能是
    None
    。因此,改变:

    if head.val == nex.val: 
    
    curr = nex.next
    

  • 当检测到重复时,只有
    nex
    应移动到下一个节点
    curr
    应保持原样,因为它可能有多个副本需要处理。因此,上述分配给
    curr
    的任务应该只在您没有重复项的情况下发生

  • 校正的
    while
    循环如下:

    while nex:
        if curr.val == nex.val: 
            curr.next = nex.next
        else:
            curr = nex
        nex = curr.next
    
    还什么 由于您的函数似乎被设计为返回一个
    ListNode
    ,只需确保始终返回
    head
    。因此,在
    while
    循环之后也添加该语句

    在我看来,这个函数不必返回head节点,因为
    head
    的值永远不会因这个函数而改变。因此,调用方已经知道该值

    注意:您不需要专门处理此案例:

    if head.next == None: 
       return head 
    
    这种情况只意味着
    while
    循环不会有一次迭代。如上所述,只需在函数的最后添加一个return语句,然后您就可以删除上面的
    if
    块:

    return head
    

    您的示例显示了已排序的列表,因此总是有重复项彼此相邻。我们必须假定列表已排序吗?另外,
    deleteDuplicates
    self
    参数是什么?你从来没有提到过它…非常感谢你,特林科特,你的解释非常清楚,我完全理解。我真的很感谢你花时间写评论。干杯,帕特里克