【力扣打卡系列】删除链表重复节点

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day14

删除链表中的节点
  • 题目描述
  • 解题思路
    • 删除指定节点(只知道Node,不知道Node上一个节点的情况下)
    • 将该节点(node)的后一个节点的值copy到node,然后删除下一个节点即可
  • 代码参考
go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteNode(node *ListNode) {
    node.Val = node.Next.Val
    node.Next = node.Next.Next
}
删除链表的倒数第N个结点
  • 题目描述
  • 解题思路
    • 法一:
      • 需要创建dummy node,因为当n为链表长度的时候,会删除掉头节点
      • 先遍历得到数组长度,然后就知道是正数第几个位置了
      • 这时再遍历到目标节点的上一个节点的位置,就可以实现删除了
    • (妙啊)法二:
      • 左右指针
        • 先让right指针走n步
        • 再left、right指针一起走,让right指针走到链表的最后一个节点
        • 此时,left指针的下一个节点即为要删除的倒数第n个节点!
  • 代码参考
go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    dummy := &ListNode{Next:head}
    left := dummy
    right := dummy
    for ;n>0;n--{
        right = right.Next
    }
    for right.Next != nil{
        right = right.Next
        left = left.Next
    }
    //注意,是左指针的下一个节点为倒数第n个节点
    left.Next = left.Next.Next
    return dummy.Next

}
  • tips
    -注意,是左指针的下一个节点为倒数第n个节点
删除排序链表中的重复元素
  • 题目描述
  • 解题思路
    • 遍历链表,值相同就把后面重复的节点删除
  • 代码参考
go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
    if head == nil{
        return nil
    }
    cur := head
    for cur.Next != nil {
        if cur.Val == cur.Next.Val{
            cur.Next = cur.Next.Next
        }else{
            cur = cur.Next
        }
    }
    return head
}
  • tips
    • 注意:cur.Next可以为空,但是cur不能为空,否则cur.Next就报错了!
      • 所以要写if else,不能只写 if
    • 注意排除头节点head为nil的情况(链表长度可能为0)
删除排序链表中的重复元素2
  • 题目描述
  • 解题思路
    • if中套循环
  • 代码参考
go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
    dummy := &ListNode{Next:head}
    cur := dummy
    for cur.Next != nil && cur.Next.Next != nil{
        value := cur.Next.Val
        if value == cur.Next.Next.Val{
            for cur.Next != nil && cur.Next.Val == value{
                cur.Next = cur.Next.Next
            }
        }else{
            cur = cur.Next
        }
    }
    return dummy.Next
}
相关推荐
北_鱼1 小时前
支持向量机(SVM):算法讲解与原理推导
算法·机器学习·支持向量机
MZWeiei2 小时前
PTA:运用顺序表实现多项式相加
算法
GISer_Jing3 小时前
Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解
javascript·算法·排序算法
cookies_s_s3 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
不想编程小谭3 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode
水蓝烟雨3 小时前
[HOT 100] 2187. 完成旅途的最少时间
算法·hot 100
01_4 小时前
力扣hot100——LRU缓存(面试高频考题)
leetcode·缓存·面试·lru
菜鸟一枚在这4 小时前
深度解析建造者模式:复杂对象构建的优雅之道
java·开发语言·算法
gyeolhada5 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯
阿巴~阿巴~5 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先