82. 删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
Example 1
输入: 1->2->3->3->4->4->5
输出: 1->2->5
Example 2
输入: 1->1->1->2->3
输出: 2->3
思路
由于考虑到了重复元素在头结点,为了方便处理,所以新创建一个头结点。p,q两个指针来判断是否重复,p,q指针首先指向同一个结点,当循环以后p,q指针仍指向同一个结点时,说明此结点不存在重复结点,pre结点在p,q结点之前。只要结点存在重复结点,那么p,q进过循环后,不在相同,此时pre下一个结点指向q结点的下一个结点,因为q的下一个结点与p结点的值不同。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head) {
//if(head == NULL) return NULL;
struct ListNode* pre = (struct ListNode *)malloc(sizeof(struct ListNode));
pre->next = head;
head = pre;
struct ListNode* p ;
struct ListNode* q ;
while(pre->next != NULL)
{
p = pre->next;
q = p;
while(q->next!=NULL && q->next->val==p->val)
{
q = q->next;
}
if(p == q) pre = pre->next;
else
pre->next = q->next;
}
return head->next;
}