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

坚持按题型打卡&刷&梳理力扣算法题系列,语言为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
}
相关推荐
不枯石几秒前
Matlab通过GUI实现点云的双边(Bilateral)滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab
白水先森2 小时前
C语言作用域与数组详解
java·数据结构·算法
想唱rap2 小时前
直接选择排序、堆排序、冒泡排序
c语言·数据结构·笔记·算法·新浪微博
豆浆whisky2 小时前
netpoll性能调优:Go网络编程的隐藏利器|Go语言进阶(8)
开发语言·网络·后端·golang·go
老葱头蒸鸡3 小时前
(27)APS.NET Core8.0 堆栈原理通俗理解
算法
视睿3 小时前
【C++练习】06.输出100以内的所有素数
开发语言·c++·算法·机器人·无人机
柠檬07114 小时前
matlab cell 数据转换及记录
算法
YuTaoShao5 小时前
【LeetCode 每日一题】2221. 数组的三角和
数据结构·算法·leetcode
little~钰5 小时前
树上倍增和LCA算法---上
算法
力扣蓝精灵5 小时前
今日分享 整数二分
算法