目录
删除有序链表中重复的元素-I
删除有序链表中重复的元素-II
删除有序链表中重复的元素-I
描述
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:
给出的链表为1→1→21→1→2,返回1→21→2.
给出的链表为1→1→2→3→31→1→2→3→3,返回1→2→31→2→3.
【解法一】哈希遍历删除(该方法下面俩道题均适合)
哈希表遍历一遍,对每个元素出现次数统计,然后再遍历第二遍,将结点元素出现次数出现超过俩次的全部删除
【解法二】直接删除

使用哑结点pre来进行删除,如果pre与cur值相等,就用pre删掉cur,如果不相等俩个一起后移就行
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // write code here
        auto newhead = new ListNode(-1);
        newhead->next = head;
        auto pre = newhead, cur = head;
        while(cur)
        {
            if(cur->val == pre->val)
            {
                pre->next = cur->next;    // 相等进行删除
                cur = pre->next;
            }
            else {
                pre = pre->next;    // 不相等后移
                cur = cur->next;
            }
        }
        return newhead->next;
    }
};删除有序链表中重复的元素-II
描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→51→2→3→3→4→4→5, 返回1→2→51→2→5.
给出的链表为1→1→1→2→31→1→1→2→3, 返回2→32→3.
【解法一】直接删除

利用pre来删除后面有相等元素的结点,每次循环定义一个Next,利用Next与cur进行比较,如果如果Next的值等于cur,那么Next不断后移(注意Next判空存在),直到找到一个nullptr或者与cur不相等的结点为止,利用pre删除中间相等的结点

 直到找到一个nullptr或者与cur不相等的结点为止,利用pre删除中间相等的结点
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // write code here
        ListNode* newhead = new ListNode(-1);
        newhead->next = head;
        auto pre = newhead, cur = head, Next = head;
        while(cur)
        {
            Next = cur->next;
            if(Next && cur->val == Next->val)
            {
                while(Next && cur->val == Next->val)
                {
                    Next = Next->next;    // Next遍历至最后一个不相等结点或者空节点
                }
                pre->next = Next;    // 利用pre进行删除
                cur = Next;        // 更新cur
            }
            else {
                pre = pre->next;    // 如果俩结点不相等,cur pre一起后移
                cur = cur->next;
            }
        }
        return newhead->next;
    }
};【解法二】哈希遍历删除
哈希表遍历一遍,对每个元素出现次数统计,然后再遍历第二遍,将结点元素出现次数出现超过俩次的全部删除







![[软件工程导论(第六版)]第5章 总体设计(课后习题详解)](https://img-blog.csdnimg.cn/1e5ebc71f4494784af26ba71e670d161.png)












