删除链表中重复的元素
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
重复的都删除
重点是:加入哑结点之后就可以使所有数据结点都有前驱结点,这样就会方便执行链表的一些操作
struct ListNode* deleteDuplicates(struct ListNode* head){
if (!head) { //排除空链表的情况
return head;
}
int a=0;
struct ListNode *dummy=malloc(sizeof(struct ListNode)); //创建一个哑节点
dummy->next=head; //加入哑结点之后就可以使所有数据结点都有前驱结点,这样就会方便执行链表的一些操作
struct ListNode* p = dummy;
while(p->next!=NULL && p->next->next!=NULL) //判断条件 为什么是要判断两个是否为空呢,因为内部函数可能会把p->next移动到最后一个节点~~
{
if(p->next->val==p->next->next->val) //出现重复节点时
{ a = p->next->val; //记录重复节点的值
while(p->next!=NULL&&p->next->val == a ){ //直到没有重复节点
p->next = p->next->next; //跳过一个重复节点
}
}
else{
p=p->next; //没有重复节点就移动p指针
}
}
return dummy->next; //返回值
}