题解 | #删除链表中重复的结点#复杂度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;
 
}

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务