Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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_Linked List - Fatal编程技术网

Python 我应该如何优化我的代码从已排序的链表中删除重复的值节点

Python 我应该如何优化我的代码从已排序的链表中删除重复的值节点,python,linked-list,Python,Linked List,我正在努力解决这个问题- 我得到一些测试用例的运行时错误,而它正在为其他一些测试用例工作。如果有人能就我应该如何优化代码提出一些方法,这将意味着很多 # # For your reference: # # SinglyLinkedListNode: # int data # SinglyLinkedListNode next # # def removeDuplicates(head): if head is None: return None

我正在努力解决这个问题-

我得到一些测试用例的运行时错误,而它正在为其他一些测试用例工作。如果有人能就我应该如何优化代码提出一些方法,这将意味着很多

#
# For your reference:
#
# SinglyLinkedListNode:
#     int data
#     SinglyLinkedListNode next
#
#

def removeDuplicates(head):
    if head is None:
        return None
    else:

        current = head
        prev = SinglyLinkedListNode("")
        prev.next = head

        while current.next != None and current != None: 

            if prev.data != current.data:
                prev = prev.next
                current = current.next
            else:

                current = current.next
                while(current != None and prev.data == current.data and current.next != None):
                    current = current.next
                if (current.next == None):
                    prev.next = None

                prev.next = current
                prev = prev.next
                if current != None and current.next != None: 
                    current = current.next

        if current.next == None and current != None: 
            if prev.data != current.data:
                prev = prev.next
            else:
                prev.next = None

        return head
更新:我刚刚改变了我的方法,并使用了一个列表来跟踪以前发生的值以进行比较。谢谢大家!!虽然我很想知道是否有任何方法来纠正上述代码


我想这部分会把你搞得一团糟:

while(prev.data == current.data):
    current = current.next
prev.next = current
prev = prev.next
current = current.next
如果循环被触发,就在您假设链接有下一个项目(可能没有)之后,我可能会在这里进行检查,以防止潜在的情况发生

可能是这样的:

while (current != None && prev.data == current.data):
    current = current.next;
prev.next = current;
prev = prev.next;

实际上,我们真的需要后面的“current=current.next”行吗?如果逻辑是这样的,我们不是已经在大while循环中进行了None检查了吗?在我们这里修复的循环结束时prev不是已经是None了吗?

我想这部分会把你搞砸:

while(prev.data == current.data):
    current = current.next
prev.next = current
prev = prev.next
current = current.next
如果循环被触发,就在您假设链接有下一个项目(可能没有)之后,我可能会在这里进行检查,以防止潜在的情况发生

可能是这样的:

while (current != None && prev.data == current.data):
    current = current.next;
prev.next = current;
prev = prev.next;

实际上,我们真的需要后面的“current=current.next”行吗?如果逻辑是这样的,我们不是已经在大while循环中执行了None检查了吗?在我们这里修复的循环结束时prev不是已经是None了吗?

您会得到运行时错误,因为您没有在多个位置检查
current
是否为
None

def removeDuplicates(head):
    if head is None:
        return None
    else:

        current = head
        prev = SinglyLinkedListNode("")
        prev.next = head

        while current != None and current.next != None: #check if current is None

            if prev.data != current.data:
                prev = prev.next
                current = current.next
            else:

                current = current.next
                while(current != None and prev.data == current.data): #check if current is None
                    current = current.next
                prev.next = current
                prev = prev.next
                if current != None: #check if current is None
                    current = current.next

        if current != None and current.next == None: #check if current is None
            if prev.data != current.data:
                prev = prev.next
            else:
                prev.next = None

    return head
在上面的代码中,我的目的不是为了清理或使代码更适合您。但是在支票遗失的地方提醒你


此外,您在这里使用的算法的算法时间复杂度是
O(n)
(其中
n
是列表中的节点总数),这是解决此问题的最佳方案。因此,不可能进一步优化算法的时间复杂度。尽管如果您对此感兴趣,代码的执行时间可能会有所改进,但从问题来看,情况并非如此

您将得到运行时错误,因为您没有在多个位置检查
current
是否为
None

def removeDuplicates(head):
    if head is None:
        return None
    else:

        current = head
        prev = SinglyLinkedListNode("")
        prev.next = head

        while current != None and current.next != None: #check if current is None

            if prev.data != current.data:
                prev = prev.next
                current = current.next
            else:

                current = current.next
                while(current != None and prev.data == current.data): #check if current is None
                    current = current.next
                prev.next = current
                prev = prev.next
                if current != None: #check if current is None
                    current = current.next

        if current != None and current.next == None: #check if current is None
            if prev.data != current.data:
                prev = prev.next
            else:
                prev.next = None

    return head
在上面的代码中,我的目的不是为了清理或使代码更适合您。但是在支票遗失的地方提醒你


此外,您在这里使用的算法的算法时间复杂度是
O(n)
(其中
n
是列表中的节点总数),这是解决此问题的最佳方案。因此,不可能进一步优化算法的时间复杂度。尽管如果您对此感兴趣,代码的执行时间可能会有所改进,但从问题来看,情况并非如此

优化和正确性/错误是两码事。在您解决错误之前,我不会担心优化。你犯了什么错误?你看过你失败的测试用例了吗?@ggorlen它只是在编译器消息框中显示“运行时错误”!!例如,您可以看到这个测试用例-检查这个用例:
1,1,1
。我希望你能找出你方法中的错误。如果没有,请在这里告诉我。@AjayDabas我仍然收到运行时错误!它对给定的基本测试用例有效,但我似乎不明白问题出在哪里。然而,在考虑了下面提到的所有更改之后,我已经更新了代码!当前时也在
中。下一步!=无和当前!=无:
第二个条件应该是顺序中的第一个条件。优化和正确性/错误是两回事。在您解决错误之前,我不会担心优化。你犯了什么错误?你看过你失败的测试用例了吗?@ggorlen它只是在编译器消息框中显示“运行时错误”!!例如,您可以看到这个测试用例-检查这个用例:
1,1,1
。我希望你能找出你方法中的错误。如果没有,请在这里告诉我。@AjayDabas我仍然收到运行时错误!它对给定的基本测试用例有效,但我似乎不明白问题出在哪里。然而,在考虑了下面提到的所有更改之后,我已经更新了代码!当前时也在
中。下一步!=无和当前!=无:
第二个条件应该是订单中的第一个条件。我修复了代码并尝试运行,但没有改进。我仍然得到一个运行时错误。关于最后一行“current=current.next”,为了运行while循环并继续前进,我们不应该在else块中也明确提到它吗?我修复了代码并尝试运行,但没有改进。我仍然得到一个运行时错误。关于最后一行“current=current.next”,为了运行while循环并继续前进,我们是否也应该在else块中明确提到它?嗨,谢谢你提醒我必须检查的必要条件。但它仍然没有运行,我仍然得到运行时错误。但是,两个给定的测试用例仍在运行。我知道改进应该是最不应该做的事情,但即使在这次调整之后,我似乎也找不到运行时错误背后的原因。我可以帮你解决一些问题。如果你需要更多的帮助,那么也许你应该开始学习如何调试小程序。我确实认为主要的问题是了解优化的进一步范围,这已经得到了回答。嗨,谢谢你提醒我必须检查的必要条件。但它仍然没有运行,我仍然得到运行时错误。但是,两个给定的测试用例仍在运行。我知道改进应该是最后一件事,但我能做到