删除链表重复的元素
要求:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。
如:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
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; //设置双指针
struct ListNode* pNext = head;
while(pNext->next!=NULL) //进入循环
{
if(pNext->next->val==p->next->val) //当有重复元素的时候
{ a = pNext->next->val;
while(pNext->next->next!=NULL&&pNext->next->next->val == a ){ //当继续有重复的元素的时候(2个以上)
pNext = pNext->next; //移动pNext指针一个单位
}
if(pNext->next->next==NULL) //这种情况是从第一个元素开始重复时
{
p->next = pNext -> next -> next;
pNext = pNext -> next;
// break;
}
else if(pNext->next->next!=NULL)
{ //如果还没有结束
p->next = pNext->next->next; // p的指针移动跳过重复的元素。
pNext = pNext->next->next; //pNext移动跳过重复元素。
}
}
else{ //如果没有重复元素就往下一位走
p=p->next;
pNext = pNext->next;
}
}
return dummy->next; //返回哑结点指针
}