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



我正在尝试解决此问题 - 从排序的链表中删除重复值

我在某些测试用例中遇到运行时错误,而它正在为其他一些测试用例工作。如果有人可以建议一些关于我应该如何优化代码的方法,这将意味着很多?

#
# 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;

实际上,我们真的需要"当前=当前.下一个"行吗? 如果遵循逻辑,我们不是已经在大 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是列表中的节点总数(,这是解决此问题的最佳方法。因此,算法时间复杂度不可能进一步优化。虽然如果你对此感兴趣,代码的执行时间可能会得到改善,但从问题来看并非如此。

最新更新