leetcode 82. 删除排序链表中的重复元素 II

leetcode 82. 删除排序链表中的重复元素 II

题目描述

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

示例 1:

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

示例 2:

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

解题思路

这里定义一个新的链表,定义一个count来记录元素出现的个数,如果出现的次数大于等于2就表示是重复的元素,然后把非重复的链接到定义的新的链表上,最后需要注意的是,用的是当前的节点和下一个节点做比较,所以需要判读一下最后的count是否超过1,如果大于1表示最后的元素是重复的,我们直接把新链表的尾结点指向NULL;要是等于1,就把head的最后一个节点添加到新链表上。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(!head){   // 链表是否为空
            return NULL;
        }
        ListNode* newHead = new ListNode(-1);  // 定义一个新的链表,存储生成的新链表
        ListNode* cur = newHead;               // 移动新链表的节点
        int count = 1;                         // 记录元素出现的次数

        while(head->next){
            if(head->val == head->next->val){
                count ++;        // 如果元素相等,那count就加1
            } 
            else{
                if(count <= 1){   // 这里是去除重复的元素,当元素不相同时,count才小于等于1时,才把元素往newHead尾部添加
                    cur->next = head;
                    cur = cur->next;
                }
                count = 1; // count置位
            }
            head = head->next; // head的节点向前移动一个
        }
        // 这里是处理边界情况,这里head与head->next的元素做比较以后,head->next元素还不确定是否为重复的元素,这里需要判读一下count的次数,如果大于1,就表示是重复的元素,直接把cur的下一个节点置为空;否则,把head直接添加到cur上
        if (count > 1){    
            cur->next = NULL;
        }
        else{
            cur->next = head;
        }

        return newHead->next;
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值