移除链表元素
题目
题意:删除链表中等于给定值 val 的所有节点。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
思路
移除操作,就是让节点next指针直接指向下下一个节点就可以了。
那么因为单链表的特殊性,只能指向下一个节点,刚刚删除的是链表的中第二个,和第四个节点,那么如果删除的是头结点又该怎么办呢?
这里就涉及如下链表操作的两种方式:
- 直接使用原来的链表来进行删除操作。
- 设置一个虚拟头结点在进行删除操作。
解法
链表的结果如下:
type ListNode struct {
Val int
Next *ListNode
}
不添加虚拟头结点方式:
func removeElements(head *ListNode, val int) *ListNode {
for head != nil && head.Val == val {
head = head.Next
}
if head == nil {
return nil
}
prev := head
for prev.Next != nil {
if prev.Next.Val == val {
prev.Next = prev.Next.Next
} else {
prev = prev.Next
}
}
return head
}
添加虚拟头结点方式:
func removeElements(head *ListNode, val int) *ListNode {
dummy := &ListNode{Next: head}
prev := dummy
for prev.Next != nil {
if prev.Next.Val == val {
prev.Next = prev.Next.Next
} else {
prev = prev.Next
}
}
return dummy.Next
}