Leetcode链表easy | 82. 删除排序链表中的重复元素 II

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

示例 1:

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

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

/**
 * 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) {
        ListNode fake(-1);
        fake.next=head;
        head=&fake;  // 新建立头结点
        
        ListNode*tail =head;
        bool dup= false;   //  指示是否存在重复值
        
        for(ListNode* p =head->next;p&&p->next;p=p->next){
            if(dup==false&& p->val==p->next->val){
                dup=true;
                continue;
            }  //  前面没重复,现在出现重复,将dup设为true
            if(dup==true&&p->val!=p->next->val){
                dup=false;
                tail->next=p->next;
                continue;
            } //  前面出现重复,删除。
            if(dup==false){
                tail=p;
            }  //  没有重复,tail向后移动,p也向后移动
            //  3个if,3种情形,剩下一种:出现3个重复,直接移动p
        }  
        if(dup==true){
            tail->next=NULL;
            
        }  //  全部是重复,直接为空
        return head->next;
       
    }
};

思路:出现重复的,继续往后走,走到没重复的,删除操作。
注意全部重复和全部不重复的情况

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode fake(-1);
        fake.next=head;
        head=&fake;
        
        ListNode *tail=head;
        bool dup=false;
        
        for(ListNode* p=head->next;p&&p->next;p=p->next){
            
            if(dup==false && p->val==p->next->val){
                dup=true;
                continue;
            }   //   遇到第一个重复值,p继续往后走
            if(dup==true && p->val==p->next->val)
                continue;   //  遇到第二个重复值,p继续往后走
            if(dup==true && p->val!=p->next->val){
                dup=false;
                tail->next=p->next;
                continue;
            }  //  前面出现重复,遇到不重复的,删除前面重复
            if(dup==false){
                tail=p;
            }  //  不重复,tail往后走
        }
        
        if(dup==true){
            tail->next=NULL;
        }  //  都重复,空链
        
        return head->next;
        
        
        
    }
};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容