zoukankan      html  css  js  c++  java
  • JZ56 删除链表中重复的结点

    删除链表中重复的结点

    题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    思路:

    由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。由于链表的头节点可能会被删除,因此我们需要额外使用一个哑节点(dummy node)指向链表的头节点。

    具体地,我们从指针 extit{cur}cur 指向链表的哑节点,随后开始对链表进行遍历。如果当前 extit{cur.next}cur.next 与 extit{cur.next.next}cur.next.next 对应的元素相同,那么我们就需要将 extit{cur.next}cur.next 以及所有后面拥有相同元素值的链表节点全部删除。我们记下这个元素值 xx,随后不断将 extit{cur.next}cur.next 从链表中移除,直到 extit{cur.next}cur.next 为空节点或者其元素值不等于 xx 为止。此时,我们将链表中所有元素值为 xx 的节点全部删除。

    如果当前 extit{cur.next}cur.next 与 extit{cur.next.next}cur.next.next 对应的元素不相同,那么说明链表中只有一个元素值为 extit{cur.next}cur.next 的节点,那么我们就可以将 extit{cur}cur 指向 extit{cur.next}cur.next。

    当遍历完整个链表之后,我们返回链表的的哑节点的下一个节点 extit{dummy.next}dummy.next 即可

    func deleteDuplication(head *ListNode) *ListNode {
        if head == nil || head.Next == nil {
            return head
        }
    
        dummy := &ListNode{
            0,
            head,
        }
        head = dummy
    
        for head.Next != nil && head.Next.Next != nil {
            if head.Next.Val == head.Next.Next.Val {
                flag := head.Next.Val
                for head.Next != nil && head.Next.Val == flag{
                    head.Next = head.Next.Next
                }
            } else {
                head = head.Next
            }
        }
    
        return dummy.Next
    }
     
  • 相关阅读:
    关于题目中的内存限制
    手动实现最小堆和最大堆(优先队列)
    线性筛素数(欧拉筛)+前缀和优化
    并查集
    快速排序

    字典按中文姓名排序
    oc程序代码
    学生字典计算年龄差 随机50个数
    nsset
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14642563.html
Copyright © 2011-2022 走看看