(详细)删除链表中重复的结点-牛客网 C语音

删除链表中重复的结点_牛客题霸_牛客网 (nowcoder.com)(点击前方链接查看题目)

一、题目

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5  处理后为 1->2->5

数据范围:链表长度满足 0≤n≤1000 0≤n≤1000  ,链表中的值满足 1≤val≤1000 1≤val≤1000 

进阶:空间复杂度 O(n) O(n)  ,时间复杂度 O(n) O(n) 

例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:

示例1

输入:{1,2,3,3,4,4,5}

复制返回值:{1,2,5}

示例2

输入:{1,1,1,8}

返回值:{8}

 二、解题思路以及代码

        本题需要考虑三种情况:
1.中间删除:

2.头删:
由于刚开始next值为NULL,所以直接将next赋给pHead
例:1 1 1 3 4 

3.尾删:
next在循环中会一直走到NULL 所以要加上遍历条件 

如果next为NULL ,NULL->next则会报错

例:2 3 4 5 5 5 

struct ListNode* deleteDuplication(struct ListNode* pHead ) {
    if (pHead == NULL || pHead->next == NULL) 
    {
        return pHead;
    }
    struct ListNode* cur = pHead;
    struct ListNode* prev = NULL;
    struct ListNode* next = cur->next;
    while (next) 
    {
        if (cur->val != next->val) 
        {
            prev = cur;
            cur = next;
            next = next->next;
        } 
        else 
        {
            while (next->val == cur->val && next != NULL) 
            {
                next = next->next;
            }
            cur = next;
            if (prev != NULL) 
            {
                prev->next = next;
            } 
            else 
            {
                pHead = next;
            }
            if (next != NULL) 
            {
                next = next->next;
            }
        }
    }
    return pHead;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值