这个题解使用了虚拟头结点(dummy node)的技巧来简化删除操作。具体思路如下:
1. 创建一个虚拟头结点 dummy,将其 next 指针指向链表的真正头结点 head。
2. 定义两个指针 pre 和 cur,分别指向虚拟头结点 dummy 和真正的头结点 head。
3. 遍历链表,当 cur 指向的节点值不等于给定的 val 时,将 pre 指针向后移动;否则,将 pre 的 next 指针指向 cur 的下一个节点,实现删除操作。
4. 最后返回虚拟头结点的 next 指针,即为删除操作后的新链表的头结点。
时间复杂度: O(n)
空间复杂度: O(1)
# 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: ListNode, val: int) -> ListNode:
# 创建虚拟头结点
dummy = ListNode(next=head)
# 初始化 pre 和 cur 指针
pre = dummy
cur = head
# 遍历链表
while cur:
if cur.val != val:
# 当前节点值不等于 val,pre 指针后移
pre = pre.next
else:
# 当前节点值等于 val,删除节点
pre.next = cur.next
# cur 指针后移
cur = pre.next
# 返回新的头结点
return dummy.next