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

坚持按题型打卡&刷&梳理力扣算法题系列,语言为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
}
相关推荐
简简单单做算法2 小时前
基于mediapipe深度学习和限定半径最近邻分类树算法的人体摔倒检测系统python源码
人工智能·python·深度学习·算法·分类·mediapipe·限定半径最近邻分类树
Tisfy3 小时前
LeetCode 2360.图中的最长环:一步一打卡(不撞南墙不回头) - 通过故事讲道理
算法·leetcode··题解
Espresso Macchiato3 小时前
Leetcode 3500. Minimum Cost to Divide Array Into Subarrays
leetcode·动态规划·leetcode hard·leetcode 3500·leetcode双周赛153
LuckyAnJo3 小时前
Leetcode-100 链表常见操作
算法·leetcode·链表
双叶8364 小时前
(C语言)虚数运算(结构体教程)(指针解法)(C语言教程)
c语言·开发语言·数据结构·c++·算法·microsoft
工一木子4 小时前
大厂算法面试 7 天冲刺:第5天- 递归与动态规划深度解析 - 高频面试算法 & Java 实战
算法·面试·动态规划
invincible_Tang6 小时前
R格式 (15届B) 高精度
开发语言·算法·r语言
独好紫罗兰7 小时前
洛谷题单2-P5715 【深基3.例8】三位数排序-python-流程图重构
开发语言·python·算法
序属秋秋秋7 小时前
算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
c语言·c++·学习·算法
玉树临风ives7 小时前
leetcode 2360 图中最长的环 题解
算法·leetcode·深度优先·图论