题目

第一次错解
移除链表节点,一般用的方法是,把前驱节点的指针域指向目标节点的下一个节点。先创建虚拟头节点,指向头节点,然后通过循环找到等于 val
的节点。
python
# Definition for singly-linked list.
# 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]:
dummy = ListNode(0) # 虚拟头节点
dummy.next = head # 此时,链表head从dummy开始
current = dummy # 还是应该写成 current = dummy?
# for current in head:
while(current.next):
if current.next.val == val:
current.next = current.next.next
current = current.next
return head
错哪了?
- 返回值错了
如果链表开头的节点就等于 val
,那在循环中,这个旧的 head
节点就不在链表里了,所以不能返回这个被废弃的 head
节点。而应该改成 dummy.next
,它表示此时真正的头节点。
- 删除结点之后,
current
无需右移
因为 current.next = current.next.next
已经删除了一个节点,如果再次右移,就会在循环中漏掉一个节点。
第二次修正
python
# Definition for singly-linked list.
# 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]:
dummy = ListNode(0) # 虚拟头节点
dummy.next = head # 此时,链表head从dummy开始
current = dummy # 还是应该写成 current = head?
# for current in head:
while(current.next):
if current.next.val == val:
current.next = current.next.next
else:
current = current.next
return dummy.next
现在是正确的了!