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

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

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

这个题目还是非常基础的链表题目~

由于是删除重复的元素,所以使用哈希数组会非常方便。题目是说node->val的范围咋-100~100,所以我们设置一个201大小的数组作为哈希数组。其中-100对应的index就是0,0对应的是100,100对应的是200

这样我们可以仅仅遍历一次链表就可以了,设置一个tail指针=head->next,首先将hash[head->val+100]设置为1,然后对tail->val进行判断。

如果遇到hash[tail->val+100]==1,说明是重复的节点,则仅仅需要执行head->next = tail->next;free(tail);tail = head->next;即可。对了,这里忘记说,在非重复的情况下,head跟随tail向后移动~

注意的特殊情况就是1.head=NULL.2.初始请款下的head->next==NULL

struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    if(head==NULL)
    {
        return NULL;
    }
    int hash[201]={0};
    struct ListNode* tail = head->next;
    if(tail==NULL)
    {
        return head;
    }
    struct ListNode* out = head;
    hash[head->val+100] = 1;
    while(tail!=NULL)
    {
        if(hash[tail->val+100]==1)
        {
            head->next = tail->next;
            free(tail);
            tail = head->next;
        }
        else 
        {
            hash[tail->val+100] = 1;
            head = head->next;
            tail = tail->next;
        }
    }
    return out;
}

全部评论

相关推荐

草稿猫编程:查看图片
点赞 评论 收藏
分享
宇宙究极无敌耀孝子:如果你计网和算法都还没准备,建议别面。 字节用go多,spring之类问得很少,重点问计网,mysql,redis,穿插点java和操作系统的八股,然后必做算法,两道算法如果都没a出来可以说是必挂。 你取消面试就算有影响凭你的bg秋招肯定还能面,要是一面就脏面评了春招秋招肯定就白瞎了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务