移除未排序链表中的重复节点,保留最开始出现的节点

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:

 输入:[1, 2, 3, 3, 2, 1]
 输出:[1, 2, 3]

示例2:

 输入:[1, 1, 1, 1, 2]
 输出:[1, 2]

提示:

链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。

//思路:创建一个大于20000的数组,使用0和1标记数字是否出现过
struct ListNode* removeDuplicateNodes(struct ListNode* head)
{
    if(head ==NULL || head->next ==NULL)
        return head;
    struct ListNode* current = head;
    struct ListNode* p = current->next;
    int arr[20001] = {0};       //定义一个大于链表长度的数组,并且初始化其元素为0
    arr[current->val] = 1;      //将第一个节点的标记置为1
    while(p)                    // p 会走在 current 下一个节点
    {
        if(arr[p->val] == 0)    //如果下一个节点中的val还没出现过,其标记位是0
        {
            arr[p->val] = 1;    //那么就将 val 的标记位 置1
            current = p;        //将两个指针向后挪一个节点(current记录被删除节点的前一个节点的位置)
            p = p->next;
        }
        else                    //如果出现过,就要删除 p所在的 节点
        {
            current->next = p->next;        //将current内保存的下一个节点位置指针 替换 成下下一个节点
            p = current->next;              //将p挪到对于current来说的下下一个结点
        }
    }
    return head;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值