编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例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;
}