这是一道算法题,写算法题最恨没有图解,懂的人不须要看你的文章,不懂的你再怎么讲解也没有几张图解来得简单易懂,下面来分析一下这道题。web
我暂时尚未更好的解决方案,虽然有一个办法解决,可是时间复杂度有点高,先看看个人思路吧。算法

这是一个无序的单链表,咱们采用一种最笨的办法,先指向首元结点,其元素值为2,再遍历该结点后的全部结点,如有结点元素值与其相同,则删除;所有遍历完成后,咱们再指向第二个结点,再进行一样的操做。
看图解:
微信

这里有两个指针变量p、q,均指向单链表的首元结点,咱们先不移动指针p,而是让指针q去遍历以后的全部结点。

先让指针p指向的结点与后一个结点比较,这里为了操做方便,咱们暂且先不移动指针q,而是这样进行比较:
p -> data == q -> next -> data
;若不相等,则让q指向下一个结点:
p = p->next
;若相等,则应该先保存下一个结点:
r = q -> next
,而后让q指针指向下一个结点的下一个结点:
q = r -> next
,并释放r指向的结点内存。
这样就成功删除了一个与首元结点重复的结点,接下来以一样的方式继续比较,直到整个单链表都遍历完毕,此时单链表中已无与首元结点重复的结点;而后咱们就要修改p指针的指向,让其指向首元结点的下一个结点,再让q指向其下一个结点,继续遍历,将单链表中与第二个结点重复的全部结点删除。以此类推,直至指针p也遍历完了整个单链表,则算法结束。spa
刚才咱们已经删除了一个结点,那么接下来p应该指向下一个结点了:
.net

此时让指针p指向的结点与下一个结点的元素值比较,发现不相等,那么让q直接指向下一个结点便可:
q = q -> next
。

继续让q指向的结点的下一个结点与p指向的结点的元素值比较,发现不相等,此时继续移动q,移动事后q的指针域为NULL,说明遍历结束,此时应该移动指针p。

经过比较发现,下一个结点的元素值与其相等,接下来就删除下一个结点便可:

此时p的指针域也为NULL,算法结束。
代码以下:指针
LinkList DeleteRepeat(LinkList l){
LinkList p,q,r;
p = l->next;
while(p != NULL){
q = p;
while(q->next != NULL){
if(p->data == q->next->data){
r = q->next;
q = r->next;
free(r);
}else{
q = q->next;
}
}
p = p->next;
}
return l;
}
微信搜索【码视界】或者扫描下方二维码关注个人微信公众号,更多精彩等着你!code
本文分享自微信公众号 - 码视界(otc_18679428729)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。orm