移除链表中的重复元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

示例 1:

移除链表中的重复元素_Go

输入: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
输出:[]

提示:

  • 列表中的节点数目在范围 [0, 104]
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

思路:

  1. 创建一个虚拟头节点 dummyHead,并将其 Next 指针指向原始链表的头节点 head。这样做是为了处理链表头节点可能被删除的情况。
  2. 创建一个指针 cur,初始时指向虚拟头节点 dummyHead
  3. 使用循环遍历链表,循环条件是 cur 不为空且 cur.Next 不为空。这样做是为了确保在遍历过程中能访问到当前节点以及当前节点的下一个节点。
  4. 在循环中,检查当前节点的下一个节点的值是否等于给定值 val。如果相等,则将当前节点的 Next 指针指向下一个节点的下一个节点,从而删除了当前节点的下一个节点。
  5. 如果当前节点的下一个节点的值不等于给定值 val,则将 cur 指针向后移动一位,指向下一个节点。
  6. 循环结束后,返回虚拟头节点 dummyHeadNext 指针,即为删除节点后的链表头节点的指针。

通过使用虚拟头节点和逐个遍历链表的方式,可以在不特别处理链表头节点的情况下,删除链表中所有值为给定值的节点。这种方法的时间复杂度为 O(n),其中 n 是链表的长度,因为需要遍历整个链表一次。

func removeElements(head *ListNode, val int) *ListNode {
     dummyHead := &ListNode{}
     dummyHead.Next = head
     cur := dummyHead
     for cur != nil && cur.Next != nil {
         if cur.Next.Val == val {
             cur.Next = cur.Next.Next
         } else{
             cur = cur.Next
         }
     }
     return dummyHead.Next
}

go中如何 创建一个链表:

在 Go 语言中,可以通过定义一个结构体来表示链表的节点,然后通过节点之间的指针链接来创建链表。以下是一个简单的示例代码,演示如何创建一个包含三个节点的链表:

package main

import "fmt"

// 定义链表节点的结构体
type ListNode struct {
    Val  int
    Next *ListNode
}

func main() {
    // 创建链表节点
    node1 := ListNode{Val: 1}
    node2 := ListNode{Val: 2}
    node3 := ListNode{Val: 3}

    // 构建链表关系
    node1.Next = &node2
    node2.Next = &node3

    // 打印链表节点的值
    cur := &node1
    for cur != nil {
        fmt.Println(cur.Val)
        cur = cur.Next
    }
}