算法题
链表(linked list)
移除链表元素

移除链表元素

题目

题意:删除链表中等于给定值 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
}