题目一:
Given a sorted linked list, delete all duplicates such that each element appear onlyonce.
For example,
Given 1->1->2
, return 1->2
.
Given 1->1->2->3->3
, return 1->2->3
.
移除重复出现的元素,因为是已经排序好的,只要考虑相邻元素之间的情况,所以不需要什么算法,直接编程
ListNode *deleteDuplicates(ListNode *head)
{
ListNode *x=head;
if(x==NULL || x->next ==NULL) return head;
ListNode *tmp=x;
while(x->next !=NULL)
{
x=x->next ;
if(tmp->val ==x ->val )
tmp->next =x->next ; //连续相同只移动next
else tmp=x; //不连续相同就移动之前的节点
}
return head;
}
题目二:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
这次是要删除所有重复的元素,主要思想跟上一个差不多,只是更新节点的判断和头结点处要额外考虑,代码如下:
ListNode *deleteDuplicates(ListNode *head)
{
ListNode *x=head;
if(x==NULL || x->next ==NULL) return head;
int flag=0;
if(head->val ==head->next->val ) flag=1; //标记头结点是否重复
ListNode *tmp=x;
while(x->next !=NULL)
{
if(x->val ==x->next->val ) //一直是重复
{
x =x->next ;
tmp->next =x->next;
}
else
{
x =x->next ;
if(x->next==NULL || x->next->val !=x ->val ) //前一个不重复,且后一个也不重复
{
tmp->next =x;
tmp=x;
if(flag==1) //处理头结点
{
head=x;
flag=0;
}
}
}
}
if(flag ==1) head=tmp->next ;
return head;
}