删除排序链表中重复元素

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

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

照例使用三个指针来

struct ListNode* deleteDuplicates(struct ListNode* head)
{
    if (head == NULL || head->next == NULL)
        return head;
    struct ListNode* Head = (struct ListNode*)malloc(sizeof(struct ListNode));
    Head->next = head;
    struct ListNode* before = Head;//用于存储头结点的前面一个
    struct ListNode* p = head;
    struct ListNode* later = head->next;//p后面一个
    while (p && p->next)//条件是p->next但首先p不能为null,所以要写p->()就要写p
    {
        later = p->next;
        if (p->val == later->val)//发现有一个
        {
            while (later && p->val == later->val)//继续在后面找,直到不是
                later = later->next;
            before->next = later;//用before接上
            p = later;//p从这个不是的开始下一次
        }
        else//没有重复的就正常移动
        {
            before->next = p;
            before = p;
            p = later;
        }
    }
    p = Head->next;
    free(Head);
    return p;
}

在这里插入图片描述

只保留一个重复出现怎么办呢?

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

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

struct ListNode* deleteDuplicates(struct ListNode* head)
{
    if (head == NULL || head->next == NULL)
        return head;
    struct ListNode* Head = (struct ListNode*)malloc(sizeof(struct ListNode));
    Head->next = head;
    struct ListNode* before = Head;//用于存储头结点的前面一个
    struct ListNode* p = head;
    struct ListNode* later = head->next;//p后面一个
    while (p && p->next)//条件是p->next但首先p不能为null,所以要写p->()就要写p
    {
        later = p->next;
        if (p->val == later->val)//发现有一个
        {
            before->next = later;//将p给扔了
            p = later;
        }
        else//没有重复的就正常移动
        {
            before->next = p;
            before = p;
            p = later;
        }
    }
    p = Head->next;
    free(Head);
    return p;
}

当然我们不用保留第一个前面的结点了,可以用两个指针做到。

struct ListNode* deleteDuplicates(struct ListNode* head)
{
    if (head == NULL || head->next == NULL)
        return head;
    struct ListNode* before = head;
    struct ListNode* p = NULL;
    while (before)
    {
        p = before->next;
        while(p && p->val == before->val)//p如果是空那就到了最后了,如果不空且与前面的相等,就向后挪一个再比较
        {
            p = p->next;
        }
        before->next = p;
        before = p;
    }
    return head;
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

©️2020 CSDN 皮肤主题: 1024 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值