题解 | #删除链表中重复的结点#复杂度O(N)和O(1)

删除链表中重复的结点

https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
struct ListNode* deleteDuplication(struct ListNode* pHead ) {
    //哨兵位
    struct ListNode* guard = (struct ListNode*)malloc(sizeof(struct ListNode));
    guard->next = pHead;
    guard->val = -1;
    //三指针依次前进遍历链表
    struct ListNode* n1 = pHead, *n2 = guard, *n3 = guard;
    while(n1)
    {
        //值不相同,三指针前进
        if(n1->val != n2 ->val)
        {
            n3 = n2;
            n2 = n1;
            n1 = n1->next;
        }
        //值相同
        else 
        {
            //del存储将要free节点的地址
            struct ListNode* del =  NULL;
            //n2节点不动 n1节点前进,顺便free
            while(n1->val == n2->val && n1)
            {
                del = n1;
                n1 = n1->next;
                n2->next = n1;
                free(del);
            }
            //出循环后删除n2,并链接链表
            del = n2;
            n2 = n1;
            if(guard->next == del)//如果链表被free,及时更新链表头
                pHead = n2;
            free(del);
            n3->next = n2;
            if(n1)//如果n1不为空,n1继续前进,为空就不操作
                n1 = n1->next;
        }        
    }
        free(guard);//释放哨兵位
        return pHead;
 
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-24 20:25
腾讯今年实习招了这么多人,后面秋招还会招人吗??想着秋招再战来着
牛客965593684号:腾讯好像2020年之后就是实习生招得多,应届生基本上不招,纯实习转正
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 18:19
个个985的硕士闭着眼睛都有15k以上的月薪,天天嚷嚷着研究生白度读了,天天嚷嚷着反向读研了........
MMMJC:不读研22本科出去的基本都拿28k呢,你不能用25的研究生和25的本科生比然后说没反向读研,而是25研和22本比呀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务