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;
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步