我正在编写代码来回答以下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