题解 | #删除有序链表中重复的元素-II#

删除有序链表中重复的元素-II

https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @return ListNode类
 */
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    if (!head || !head->next) {
        return head;
    }

    struct ListNode* pre = head;
    struct ListNode* cur = head->next;
    bool* flag = (bool* )malloc(sizeof(bool) * 3000);
    
    for(int i = 0;i < 3000;i++){
        flag[i] = false; //用数组实现哈希表来存放数据,标记需要删除的元素
    }

    while (cur) {

        while (pre->val == cur->val && cur) {
            cur = cur->next;
            flag[pre->val + 1000] = true;//使用移码的思想来实现对于负数的标记
        }

        pre->next = cur;//如果是一般情况那么这句代码就不起作用
        pre = cur;

        if (cur)
            cur = cur->next;

    }

    struct ListNode* pr = (struct ListNode* )malloc(sizeof(struct ListNode));
    pr->next = head;
    struct ListNode* tp = pr;
    struct ListNode* cr = head;

    while(cr){
        
        if(flag[cr->val + 1000]){
            tp->next = cr->next;
        }

        else{
            tp = cr;//不满足上述条件时才需要移动tp指针,否则就会讲tp指针指向一个本应该已被删除的元素
        }

        cr = cr->next;

    }

    return pr->next;

}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务