首页 > 其他分享 >移除链表中的重复元素

移除链表中的重复元素

时间:2023-08-21 22:00:34浏览次数:27  
标签:ListNode cur val 重复 Next 链表 移除 节点

移除链表中的重复元素

给你一个链表的头节点 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
    }
}

标签:ListNode,cur,val,重复,Next,链表,移除,节点
From: https://blog.51cto.com/Siri/7180281

相关文章

  • 196. 删除重复的电子邮箱
    表: Person+-------------+---------+|ColumnName|Type|+-------------+---------+|id|int||email|varchar|+-------------+---------+id是该表的主键列(具有唯一值的列)。该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。......
  • python实现链表(单链,双链)
    #code:utf-8#createTime:2023.8.17#-----------------------------------------------------------------------------classNode:"""节点类,每个数据就是一个节点,包含一个数据位和一个指针位,指针指向下一个数据的内存地址"""def__init__(s......
  • *【学习笔记】(10) 块状链表
    块状链表(尚未完善)对于线性表,可以\(O(1)\)的访问,但是插入和删除操作是\(O(n)\)对于链表,可以\(O(1)\)的进行插入和删除,但是是\(O(n)\)的访问。于是本着分块的思想,有了块状链表。大概长这个样子。每个块的大小数量级在\(O(\sqrt{n})\),块数的量级\(O(\sqrt{n})\)主......
  • Leetcode 142. 环形链表II(Linked list cycle ii)
    题目链接给定一个链表的头节点head,返回链表开始入环的第一个节点。.如果链表无环,则返回null.如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环.为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始).......
  • Leetcode 160. 链表相交(Intersection of two linked lists lcci)
    题目链接给定两个单链表的头节点headA和headB,请找出并返回两个单链表相交的起始节点.如果两个链表没有交点,返回null.图示两个链表在节点c1开始相交,题目数据保证整个链式结构中不存在环.示例1:输入:intersectVal=8,listA=[4,1,8,4,5],listB=[5,0,1,8,4,5],sk......
  • 剑指 Offer 36. 二叉搜索树与双向链表
    本题比较重要的有两点:1.一般认为有序的二叉搜索树,都是中序遍历。2.中序遍历的递归顺序,得到的就是排好序的,就是链表的顺序,因此只需管遍历的过程中的链表指向即可。classSolution{public://pre将来指向尾节点,head指向头节点Node*pre=nullptr,*head=nullptr;......
  • 代码随想录算法训练营第三天| 203.移除链表元素 ,707.设计链表 ,206.反转链表
    203.移除链表元素题目给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。第一想法定义一个指针a指向头节点,顺序遍历链表,循环结束的条件是指针a.next为null删除操作是判断a.next.val=val时让a.next=a.next.nex......
  • LCR 026. 重排链表
    LCR026.重排链表/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=val;this.next......
  • C习题-链表
    1.在一个长度为 n ( n>1 )的单链表上,设有头和尾两个指针,执行()操作与链表的长度有关。A、删除单链表中的第一个元素B、删除单链表中的最后一个元素C、在单链表第一个元素前插入一个新元素D、在单链表最后一个元素后插入一个新元素答案:B;需要遍历至最后一个元素的......
  • 移除重新引用dll不起作用,依然是有黄色的感叹号
    记录下今天遇到的一个很奇怪的问题:移除重新引用dll不起作用,依然是有黄色的感叹号深入的原因未知,我是将项目拷贝了一下,重新生成出现的问题。解决办法就是只用最原始的项目。从svn,到本地,全部都改为了同一个正常的项目,放弃拷贝这一方法。......