该题解采用了一个虚拟头节点(dummy node)的技巧来简化删除操作。首先,创建了一个虚拟头节点并将其指向真正的头节点。然后,使用两个指针,'pre'(前驱节点)和'cur'(当前节点),'pre'初始化为虚拟头节点,'cur'初始化为头节点。遍历链表,比较当前节点的值与目标值。如果相等,通过修改前驱节点的next指针来跳过当前节点,从而实现删除操作。如果当前节点的值不等于目标值,则同时移动两个指针前进。这样,当遍历完成后,链表中所有等于目标值的节点都会被删除。最后返回虚拟头节点的下一个节点,即更新后的链表头节点。
时间复杂度: O(n)
空间复杂度: O(1)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
dummy = ListNode(0) # 创建虚拟头节点
dummy.next = head # 将虚拟头节点指向实际的头节点
pre = dummy # 前驱节点
cur = head # 当前节点
while cur: # 遍历链表
if cur.val == val: # 如果当前节点是目标节点
pre.next = pre.next.next # 删除当前节点
else:
pre = pre.next # 移动前驱节点
cur = pre.next # 移动当前节点
return dummy.next # 返回更新后的头节点