题目
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
提示:
1. 链表中节点数目在范围 [0, 300] 内
2. -100 <= Node.val <= 100
3. 题目数据保证链表已经按升序排列
代码一
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
struct ListNode *p,*h;
h=head; //保证原链表头结点不丢失
while(h!=NULL)
{
p=h->next; //p指向当前结点的下一个结点
while(p!=NULL) //从当前结点h的下一个结点开始遍历,把重复的结点去掉
//while(p!=NULL&&(h->val >= p->val)) 这样写也行
{
if(p->val == h->val)
h->next=p->next;
p=p->next;
}
h=h->next;
}
return head;
}
代码二
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
struct ListNode *h;
if(head==NULL) //如果链表为空链表,直接返回
return head;
h=head; //保证原链表头结点不丢失
while(h->next!=NULL)
{
if(h->val == h->next->val) //若h的下一个结点与h结点值相同,则h->next等于h->next->next
{
h->next=h->next->next;
}
else //h的下一个结点与h结点值不同,说明与h结点值相同的结点已经处理完毕,h指向其下一个结点
{
h=h->next;
}
}
return head;
}