区分头节点和中间节点的python代码:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
# 删除头节点
while head and head.val == val:
head = head.next
new_head = head
# 删除中间节点
while new_head and new_head.next:
if new_head.next.val == val:
new_head.next = new_head.next.next
else:
new_head = new_head.next
return head
在删除中间节点while循环中,删除节点与指针后移不能在同一次循环中进行。我一开始的代码:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
# 删除头节点
while head and head.val == val:
head = head.next
new_head = head
# 删除中间节点
while new_head and new_head.next:
if new_head.next.val == val:
new_head.next = new_head.next.next
new_head = new_head.next
return head
对于部分测试案例不能通过。例如节点为[1, 2, 2, 1],删除值为2的节点。
删除第一个2后,节点为[1, 2, 1]。此时new_head指向1。若这时new_head指针后移,将指向2,但是判断条件为new_head.next的值,并不是new_head的值,因此将会漏过new_head指向的2。最终结果是[1, 2, 1],少删除了第二个2。