如何检测链表中元素是否存在,避免添加重复元素?
问题原因及解决方法
你的问题出在Appartient函数的实现上——你错误地通过将集合转为字符串后,取字符的ASCII值来判断元素是否存在,这完全不符合逻辑:
- 数字的字符串形式(比如
10)会被拆成'1'和'0'两个字符,它们的ASCII值分别是49和48,和原数字10完全不相等 - 字符串的长度和集合元素数量也不对应(比如多位数元素会让字符串长度大于元素个数)
正确的做法是直接遍历链表的每个节点,对比节点的elem字段和目标值:
func (e Ensemble) Appartient(valeur int) bool { for curr := e.ensemble; curr != nil; curr = curr.suivant { if curr.elem == valeur { return true } } return false }
替换掉原来的Appartient函数后,Ajouter方法就能正确检测重复元素,最终输出会是{10 20 42},元素数量为3,不会出现重复的10。
另外可以优化下String方法的输出格式,让它更规范:
func (c Cellule) String() string { return fmt.Sprintf("%v", c.elem) } func (e Ensemble) String() string { if e.EstVide() { return "{}" } res := "{" for curr := e.ensemble; curr != nil; curr = curr.suivant { res += fmt.Sprintf("%v ", curr.elem) } return res[:len(res)-1] + "}" }
内容的提问来源于stack exchange,提问作者Kevster
相关产品推荐
相关产品推荐

