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

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

删除链表中的节点
  • 题目描述
    在这里插入图片描述
  • 解题思路
    • 删除指定节点(只知道Node,不知道Node上一个节点的情况下)
    • 将该节点(node)的后一个节点的值copy到node,然后删除下一个节点即可
  • 代码参考
/**
 * 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个节点!
  • 代码参考
/**
 * 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个节点
删除排序链表中的重复元素
  • 题目描述
    在这里插入图片描述
  • 解题思路
    • 遍历链表,值相同就把后面重复的节点删除
  • 代码参考
/**
 * 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中套循环
  • 代码参考
/**
 * 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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值