1.题目:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
2.代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head) {
if(head==NULL) //空
return NULL;
if(head->next==NULL) //只有一个
return head;
struct ListNode* t=(struct ListNode* )malloc(sizeof(struct ListNode));
t->next=head;
struct ListNode* p=t,*p1=head,*p2=head->next; //p之前到p都是修改过的,新节点连在p后面
if(head->val!=head->next->val){ //先把第一个修改了
p=head;
}
while(p2){
if(p1->val==p2->val){
if(p2->next==NULL){ //一样的但是直接结束了
p->next=NULL;
break;
}
else
p2=p2->next; //一样的但没结束
}
else{
if(p2->next!=NULL){ //不一样并且不是直接结束了
if(p2->val==p2->next->val){
p1=p2;
p2=p1->next;
}
else{
p->next=p2;
p=p2;
p1=p; //p1==p是为了[1,2,3,4]这种连续不一样的情况
p2=p1->next;
}
}
else{
p->next=p2;
break;
}
}
}
return t->next;
}
3.知识点:
双指针法。