给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

思路:这个题目和上一个不太一样,因为它不留下重复的元素。我一开始的思路是,先遍历链表,将每个值的个数计算并保存下,再次遍历链表,并将只出现的一次的节点留下来,但是这样遍历两次的思想显然不明智,而且我计数的方式也不太适合,num[p->val]++,如果链表中的值是负数,显然就不行了,这里自然有其他的计数方法(这里不讨论),但是这里先放弃这种做法。

下面直接贴代码,我这里就说下应该注意的点:(1)头结点的变化,如果重复的数字出现在一开始,头结点head是一定要更换的(2)如果整个链表中遍历完都没有找到没有重复的节点,意味着要返回空,这里最后要注意判断(3)对待链表的最后,如果剩下一个没有重复的,要加入链表,因为程序的双指针遍历,条件判断不到

 ListNode* deleteDuplicates(ListNode* head)
    {
        if(head==NULL || head->next==NULL) return head;
        ListNode* p1,*p2,*p3;
        p3=NULL;
        p1=head;
        p2=p1->next;
        int num=1,flag=0;
        while(p2)
        {
            if(p2->val==p1->val)
            {
                num++;
            }
            else if(p2->val!=p1->val && num>1)
            {
                p1=p2;
                num=1;
            }
            else
            {
                if(flag==0)
                {
                    head=p3=p1;
                    flag=1;
                }
                else
                {
                   p3->next=p1;
                    p3=p3->next;
                }
                p1=p1->next;
            }
            p2=p2->next;
        }
        if(p1->next==NULL)
        {
            if(p3==NULL)
            {
                head=p3=p1;
            }
            else
            {
                p3->next=p1;
                p3=p3->next;
            }
        }
        if(p3==NULL) return NULL;
        p3->next=NULL;
        return head;
    }

我觉得自己的上述做法虽然理清了思路,但是还是太繁琐了,所以寻找下大神们简洁的代码实现

ListNode* deleteDuplicates(ListNode* head) {
        if(!head)
            return nullptr;
        
        ListNode* pre=nullptr;
        ListNode* cur=head;
        while(cur)
        {
            if(cur->next && cur->next->val==cur->val)
            {
                int a=cur->val;
                while(cur->next && cur->next->val==a)
                {
                    cur=cur->next;
                }
                if(!pre)
                {
                    head=cur->next;
                }
                else
                {
                    pre->next=cur->next;
                }
            }
            else
            {
               pre=cur;
            }
            cur=cur->next;
        }
        return head;
    }

 

posted on 2018-08-03 21:13  Mini_Coconut  阅读(385)  评论(0编辑  收藏  举报