删除排序链表中的重复元素

目录

题目描述

思路

代码

测试用例

​编辑 执行结果

错误代码

 问题分析


题目描述

删除排序链表中的重复元素_第1张图片

思路

  1. 找到相同元素的头节点
  2. 找到相同元素的尾节点
  3. 头节点和尾节点都不是那个相同元素
  4. ListNode *p遍历并存放第一个相同元素,ListNode *q遍历最后一个相同元素,存放第一个不是相同元素节点的节点
  5. 循环遍历删除重复元素节点

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==nullptr||head->next==nullptr)
        return head;
        ListNode *p=head;
        ListNode *q=head->next;
        ListNode *pre=head;
        ListNode *t=nullptr;
        while(q!=nullptr)
        {
            if(p->val==q->val)
            {
                while(q!=nullptr&&p!=nullptr&&p->val==q->val)
                {
                    q=q->next;
                } 
                if(p==head)
                    head=q;
                    else
                    pre->next=q;
                while(p!=q)
                {
                    t=p;
                    p=p->next;
                    delete t;
                    t=nullptr;
                }
                    if(q!=nullptr)
                    q=q->next;
            }
            else
            {
                pre=p;
                p=q;
                q=q->next;
            }
        }
        return head;
    }
};

测试用例

删除排序链表中的重复元素_第2张图片 执行结果

删除排序链表中的重复元素_第3张图片

错误代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==nullptr||head->next==nullptr)
            return head;
        ListNode*p=head;
        ListNode*q=head->next;
        ListNode*pre=head;
        while(q!=nullptr)
            {
            	while(p->val==q->val)
                 {
                    if(p->next!=q->next)
                        {
                        if(pre==head)
                            head=q->next;
                        else
                       	    pre->next=q->next;
                        delete p;
                        p=nullptr;
                        break;
                    }
                    else
                    {
                        pre->next=q;
                        delete p;
                        p=nullptr;
                        p=q;
                    }
                p=q;
            	q=q->next;
                 }
            pre=p;
            p=q;
            q=q->next;
            }
            
        return head;
    }
        
};

 问题分析

  1. 要小心从头节点就开始的重复元素,要多加判断
  2. 处理删除相同元素节点时,小细节的处理还是很重要
  3. 一定要多多注意审题,刚开始我以为是删除重复元素,是要留一个的,第一次提交以后才发现是要全部删除,这下思路就完全不一样了

你可能感兴趣的:(力扣刷题,链表,数据结构)