当我调用一个跳过链表中节点的函数时,为什么输出是一个空列表



我正在编写代码来回答以下LeetCode问题:

给定链表的头和一个整数val,移除链表中所有具有Node.val == val的节点,并返回新的头

示例1

Input: head = [1,2,6,3,4,5,6]
val = 6 
Output: [1,2,3,4,5]

这是我的代码:

class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
curr= head
dummy=ListNode(0)
prev=dummy
def skipper(prev,curr):  
if curr.val == val:
curr = curr.next
else:
prev.next = curr
temp = curr
prev = temp
curr = curr.next
while prev.next:
if prev.next.val == val:
prev.next = curr
return curr
while curr: 
return skipper(prev,curr)

return dummy.next

对于上面的代码,我知道逻辑是有效的,因为当我用while curr替换内部函数def skipper(prev,curr),并删除代码底部的while curr时,代码就通过了所有测试。

但我想了解如何在函数中使用/调用函数。

Capper函数只是一次运行一个节点的链表,并"删除"或重新链接节点,从而跳过任何与值相同的节点。

我的问题是,我不确定在队长的职责范围内应该返回什么,作为默认,我已经返回了curr,因为对我来说这是有意义的。

但是当我运行上面的代码时,我会得到一个超时错误。

您的代码中的一些问题(正如它首次发布的那样(:

  • return skipper(prev,curr)将退出循环,但列表中可能还有更多节点需要删除。skipper只处理由相同值组成的子序列,但它不会超越这一点。列表不一定要排序,因此值的出现不一定要分组在一起。

  • 请注意,skipper中的变量prev与另一个外部prev不是同一个变量。因此skipper中的分配prev=curr是非常无用的

  • 除非列表以搜索到的值开头,否则dummy.next将始终保持为None,这就是函数返回的值。您应该初始化dummy,使其链接到head作为下一个节点。在更新的代码中,您处理了这一点,但它是以一种模糊的方式完成的(在else部分中(。dummy应该被初始化为整个列表的头,所以它和任何其他节点一样。

在您更新的代码中,还有一些其他问题:

  • while prev.next:有成为无限循环的风险,因为当prev不是最后一个节点时,它会继续,但如果它的值不等于搜索到的值,它也不会在该列表中前进

我建议在不使用skipper函数的情况下执行此操作。您的主循环可以一个接一个地处理current.val == val的情况。

这是更正后的代码:

class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
curr = head
dummy = ListNode(0, head)  # Link to head!
prev = dummy
while curr: 
if curr.val == val:    
prev.next = curr.next  # This is all that needs to happen
else: 
prev = curr
curr = curr.next  # This should happen in both cases
# The loop invariant is: prev.next == curr
return dummy.next        

我看不出单独的skipper函数有什么好处,因为最终它必须完成主函数必须做的所有事情:即查找val的出现并跳过它们。

如果你真的想要一个子函数,那么也许可以:

class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
curr = head
dummy = ListNode(0, head)
prev = dummy
def skipper(curr):
while curr is not None and curr.val == val:
curr = curr.next
return curr

while curr: 
if curr.val == val:    
prev.next = skipper(curr)
else: 
prev = curr
curr = prev.next
return dummy.next

相关内容

  • 没有找到相关文章

最新更新