链表删除元素有两种方式,一种是直接删除,一种是构建一个虚拟头结点进行删除
其中,构建虚拟头结点的好处是,我们可以用统计的方式增加和删除链表中的元素,如果不用虚拟头结点的话,头节点和非头结点的删除方式是不统一的。
直接删除
func removeElements(head *ListNode, val int) *ListNode {
// 删除头结点
for head != nil && head.Val == val {
head = head.Next
}
// 删除非头结点
cur := head
for cur != nil && cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
}else {
cur = cur.Next
}
}
return head
}
其中,在删除非头结点的时候,我们如果想删除 cur.Next 元素 (cur是头结点,头结点一定不是要删除的元素),cur.Next = cur.Next.Next 。
还有一个需要注意的是:我们最终返回的是head,也就是说head是不能改变的,所以我们新定义了一个cur临时指针,cur指针一直是在变化的, 一直在操作head。
构建虚拟头结点后进行删除
func removeElements(head *ListNode, val int) *ListNode {
dummyNode := &ListNode{Val: 0, Next: head}
cur := dummyNode
for cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
} else {
cur = cur.Next
}
}
return dummyNode.Next
}