美文网首页
Leetcode链表easy | 82. 删除排序链表中的重复元

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

作者: Ivan_Lan | 来源:发表于2018-11-24 20:05 被阅读7次

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

示例 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;
        
        
        
    }
};

相关文章

网友评论

      本文标题:Leetcode链表easy | 82. 删除排序链表中的重复元

      本文链接:https://www.haomeiwen.com/subject/rjwyqqtx.html