leetcode 第 82 题:删除排序链表中的重复元素 II(C++)

82. 删除排序链表中的重复元素 II - 力扣(LeetCode)
在这里插入图片描述
使用哨兵节点简化处理:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(!head)   return head;
        auto dummy = new ListNode(-1);
        dummy->next = head;
        auto p = dummy, cur = head;
        while(cur && cur->next){
            int flag = 0;
            while(cur->next && cur->val == cur->next->val){
                flag = 1;//置位,表示有相同的值,需要删除
                cur = cur->next;
            }
            if(flag == 0)   p = cur;   
            else p->next = cur->next;
            cur = cur->next;
        }
        return dummy->next;
    }
};

优化一下代码;

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(!head || !head->next)   return head;
        auto dummy = new ListNode(-1);
        dummy->next = head;
        auto pre = dummy, cur = head;
        while(cur && cur->next){
            if(cur->val != cur->next->val){
                pre = cur;
                cur = cur->next;
            }else{
                while(cur->next && cur->val == cur->next->val){
                    cur = cur->next;
                }
                pre->next = cur->next;
                cur = cur->next;
            }
        }
        return dummy->next;
    }
};

如果不使用哨兵节点:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(!head || !head->next)   return head;
        bool flag = false;//用于标记head是否要去掉
        while(head->next && head->val == head->next->val){
            flag = true;
            head = head->next;
        }
        auto p = head, cur = head;
        while(cur && cur->next){
            if(cur->val != cur->next->val){
                p = cur;
                cur = cur->next;
            }else{
                while(cur->next && cur->val == cur->next->val){
                    cur = cur->next;
                }
                p->next = cur->next;
                cur = cur->next;
            }
        }
        return flag == true ? head->next : head;
    }
};

也可以使用递归或者哈希表处理

  • head 后面有值而且和 head 的值相等,那么就找到不相等为止,然后对后面一个结点去递归,这样就把前面重复的给删除了。
  • head 后面有值但和 head 的值不等,那么就递归后面一个结点,接在 head 的后面

递归不用使用哨兵节点

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(!head || !head->next)   return head;
        if(head->val == head->next->val){
            while(head->next && head->val == head->next->val){
                head = head->next;
            }
            return deleteDuplicates(head->next);
        }
        else head->next = deleteDuplicates(head->next);
        return head;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_32523711/article/details/109103564
今日推荐