您的位置:首页 > 其它

删除链表中重复的元素

2014-05-08 17:00 169 查看
今天做的LeetCode上的题:要求删除一个连表中重复的元素并不保留重复的元素

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.

经过多次调试终于调试通了,LeetCode 上做题的好处是,对于每个你遇到的错误的情况,它都会给出你错误的例子,然后再针对自己的错误例子进行程序的改进,一开始考虑的情况没有那么完善,慢慢增加没有考虑到的情况,这也提醒我们再平时遇到问题的时候应该多考虑一些情况,尤其是端点的情况,这道题要删除重复的元素,第一种是最常见的情况,对于第二种就要多考虑了。这里用到的是保存要删除元素前一个地址的情况,第二种情况,对于一开始就遇到重复元素的,最后得到的链表的首地址要改变这点要多加考虑:下面是我的代码,感觉写的很烂,有需要完善的地方请多指点:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if(head==NULL)
return NULL;
ListNode *pre;
ListNode *p;
ListNode *q;
int flag=0;
p=head;
q=head->next;
while(q){
if(p->val!=q->val){
flag=1;
pre=p;
p=p->next;
q=q->next;
}else{
while(p->val==q->val){
q=q->next;
if(!flag&&q==NULL){
head=q;
return head;
}
if(flag&&q==NULL){
pre->next=NULL;
return head;
}
}
if(flag==0){
pre=q;
head=pre;
}else{
pre->next=q;
}
p=q;
q=q->next;
}
}
return head;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息