<p>以下是代码中的问题:</p>
<ul>
<li><p>当您递归调用<code>checkHead</code>时,不会捕获它返回的值,因此递归调用是无用的。它唯一的实用程序是它返回的内容。因此,正如您在<code>removeElements</code>中已经正确执行的操作一样,您还应该在此处将返回值分配给<code>head</code>:</p>
<pre><code>head = self.checkhead(head,val)
</code></pre>
</li>
<li><p><code>elif head.val</code>是错误的。它应该是<code>elif head.val == val</code>。很遗憾你根本就需要这个。如果您将<code>if</code>条件(在它上面)测试<code>head</code>而不是<code>head.next</code>,那么您根本不需要<code>elif</code>案例</p>
</li>
<li><p><code>while curr</code>循环不能很好地处理搜索值在一行中出现两次的情况。在这种情况下,您还将<code>cur</code>移动到<code>cur.next</code>,下一次迭代将不看<code>cur.val</code>,而是看<code>cur.next.val</code>。因此<code>cur</code>处的值永远不会被检查。所以您应该在<code>else</code>块中执行<code>cur = cur.next</code></p>
</li>
<li><p>最后的<code>return</code>是错误的。您不应该返回<code>None</code>,因为<code>while cur</code>循环可能会在列表中保留一些节点。所以返回<code>head</code></p>
</li>
</ul>
<p>通过这些更改,实际上也不需要有两个<code>if not head</code>检查:现在可以省略这两个检查</p>
<p>以下是更正后的代码:</p>
<pre><code>class Solution:
def checkHead(self, head, val):
# Check that head is not None, instead of checking head.next
if head and head.val == val:
# Should use the value returned by recursive call
head = self.checkHead(head.next, val)
return head
def removeElements(self, head: ListNode, val: int) -> ListNode:
head = self.checkHead(head, val)
curr = head
while curr and curr.next:
if curr.next.val == val:
curr.next = curr.next.next
else: # Only move to next when no match
curr = curr.next
return head # Should return head, not None
</code></pre>
<p>这会奏效的。尽管如此,看到递归和迭代代码的混合还是有点奇怪,这也是除了<code>removeElements</code>之外还需要单独方法的原因。实际上,您可以使用递归执行所有操作:</p>
<pre><code>class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
if head:
if head.val == val:
return self.removeElements(head.next, val)
else:
head.next = self.removeElements(head.next, val)
return head
</code></pre>