BM16 删除有序链表中重复的元素-II
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.
解法
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
typedef struct ListNode* pnode;;
struct ListNode* deleteDuplicates(struct ListNode* head ) {
// write code here
if(!head||!head->next)return head;
struct ListNode tmphead = {.val = -1 , .next = NULL};
pnode ptmp = &tmphead;
pnode p = head;
pnode q = head->next;
while(q)
{
if(p->val == q->val)
{
q = q->next;
while(q&&p->val==q->val)
{
q = q->next;
}
if(!q){
ptmp->next = NULL;
return tmphead.next;
}
p = q ;
q = q->next;
if(!q)
{
ptmp->next = p;
ptmp = ptmp->next ;
break;
}
}else{
ptmp->next = p ;
ptmp = ptmp->next ;
p = q;
q = q->next;
if(!q)
{
ptmp->next = p;
ptmp = ptmp->next ;
break;
}
}
}
return tmphead.next;
}