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

坚持按题型打卡&刷&梳理力扣算法题系列,语言为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
}
相关推荐
wanderist.11 小时前
2025年蓝桥杯省赛C++大学A组
c++·算法·蓝桥杯
啊董dong11 小时前
noi-2025年12月16号作业
数据结构·c++·算法·noi
white-persist11 小时前
【攻防世界】reverse | simple-check-100 详细题解 WP
c语言·开发语言·汇编·数据结构·c++·python·算法
长安er12 小时前
LeetCode 01 背包 & 完全背包 题型总结
数据结构·算法·leetcode·动态规划·背包问题
小南家的青蛙12 小时前
LeetCode第2658题 - 网格图中鱼的最大数目
算法·leetcode·职场和发展
ZHang......12 小时前
LeetCode 1114. 按序打印
java·开发语言·算法
仰泳的熊猫12 小时前
1083 List Grades
数据结构·c++·算法·pat考试
Tan_Zhixia12 小时前
时间复杂度判断
数据结构·c++·算法
雪弯了眉梢13 小时前
OpenGL(八)摄像机(Camera)
算法·图形渲染·opengl
~~李木子~~13 小时前
基于 MovieLens-100K 数据集的推荐算法设计与实现
算法·机器学习·推荐算法