题目描述
思路
删除链表的重复元素可以使用对比的方法,前后两个元素进行对比,两个元素相同就进行删除,不同就继续遍历。
解题方法
第一步,分为两种情况,第一种为两个节点相同的情况,第二种时两个节点不同的情况
第二步,第一种情况下为要删除的情况,需要删除,之后再链接;第二种为不同的情况,需要继续遍历寻找
第三步,第一种情况下主逻辑为一个变量遍历到下一个不同的节点,另一个变量依次删除节点,第三个变量则链接链表。
第四步,存在特殊情况,分为头删和尾删、全部删除,这三个需要注意野指针的问题
第五步,删除完成后返回链表头指针
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode Node;
struct ListNode* deleteDuplicates(struct ListNode* head) {
if(head==NULL||head->next==NULL)
{
return head;
}
Node* prev=NULL;
Node* cur=head;
Node* next=cur->next;
while(next)
{
if(cur->val==next->val)//相等进入删除
{
while(next && cur->val==next->val)//由于可能会出现多个要删除的节点所以需要循环
{
next=next->next;
}
if(prev)//如果出现最前面的几个节点要删除则会出现野指针问题
{
prev->next=next;
}
else
{
head=next;
}
while(cur!=next)//挨个删除节点
{
Node* del=cur;
cur=cur->next;
free(del);
}
if(next)//如果最后几个节点需要删除,next会出现野指针
{
next=next->next;
}
}
//如果不相等则继续遍历
else
{
prev=cur;
cur=next;
next=next->next;
}
}
return head;
}