描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
数据范围:链表长度满足 ,链表中的值满足
进阶:空间复杂度 ,时间复杂度
例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:
解题思路:通过三指针法解决
通过prev记录节点,方便找删除以后的节点,slow是删除的头节点,fast为尾节点,其中要考虑全为1和节点全为空的情况,并且找到要删除的节点时,需要用循环来单独释放空间,具体思路如下图所示
struct ListNode* deleteDuplication(struct ListNode* pHead ) {
struct ListNode*fast=pHead->next;
struct ListNode*slow=pHead;
struct ListNode*prev=NULL;
if(pHead==NULL)
{
return NULL;
}
while(fast)
{
if(fast->val!=slow->val)//不等的情况
{
prev=slow;
fast=fast->next;
slow=slow->next;
}
else
{
while((fast!=NULL)&&(slow->val==fast->val))
{
fast=fast->next;
if(prev==NULL)//此时prev没有移动,要删除的点从头开始
{
pHead=fast;//直接置头,说明是一个相同的节点
}
else//说明不是从头开始
{
prev->next=fast;
}
}
//释放空间
while(slow!=fast)
{
struct ListNode *p=slow;
slow=slow->next;
free(p);
}
if(fast!=NULL)
{
fast=fast->next;
}
}
}
return pHead;
}



