82 remove duplicates from sorted list II

考虑到头两个可能就是重复,申请使用一个dummy节点,
1 ,当遇见前后重复的节点就删除当前节点,并记录下重复节点的val.
2, 下次遍历如果遇见当前节点的值和dup val一样,就删除当前节点

*没有释放被删除节点,下次改进

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* deleteDuplicates(struct ListNode* head) {
 
    if(head == NULL)
        return NULL;
    struct ListNode *dummy = calloc(1, sizeof(struct ListNode));
    dummy->next = head;

    struct ListNode * prev, * curr, *next, *dup;
    struct ListNode *tmp;

    prev = dummy;
    curr = dummy->next;
    next = curr->next;
    dup = NULL;

    while(curr){
        if(dup && curr->val == dup->val){

            tmp = curr;
            curr = curr->next;
            free(tmp);
            if(curr)
                next = curr->next;
            else
                next = NULL;
            prev->next = curr;
        }else if((next && next->val == curr->val)){
            //delete next
            prev->next = next->next;
            
            //mark duplicate value
            if(dup == NULL)
                dup = calloc(1,sizeof(ListNode));
            dup->val =  next->val;
            tmp = next;
            free(tmp);
            curr = prev->next;
            if(curr)
                next = curr->next;
            else
                next = NULL;
        }else{
            curr = curr->next;
            if(curr)
                next = curr->next;
            else
                next = NULL;
            prev = prev->next;
        }
    }

    
    struct ListNode * tmp2 = dummy->next;
    free(dummy);
    return tmp2;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容