中级农民
- 积分
- 112
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-6-9
- 最后登录
- 1970-1-1
|
本帖最后由 fentoyal 于 2017-8-17 10:51 编辑
LZ太逗了,我那个帖子居然每个楼都加米了!!谢谢lz大米!不想当米饭桶,光吃不干,所以我帮lz看了下这问题。
这题问题有点复杂,我先描述下,你再看代码。
问题不是coding的问题,主要是lz对OOD的思想还没有领会。
lz的Solution 类对着lz的linkedlist类的head一阵猛改,可整个removeElement函数里根本没用到LinkedList这个类。那lz把人家head改的乱起八糟后,通知人家了吗?LinkedinList里那个head还指着原来的位置啊。
详细解释就是,你的行为本质是这样的:
LinkedList 的head ->[7] -> NULL
同时你在main函数里也有个局部变量head->[7]->null
然后你通过main函数的局部变量head把7删了,head->null,然后又把这个head赋给了newHead: newHead->null
但你过程中没碰LinkedList的head呀人家还指着head->[7已经delete,剩下一个undefined空间]->null
这时候这么一个严重corrupt的list要被扔进你的析构函数析构,肯定各种崩溃呀。
但我为啥说你这其实是OOD的问题呢,因为你要删除你的list上的一个节点,这个删除函数是改变list的结构的,这个删除函数理应定义在list上,而不是由第三方的class Solution来做。
如果你的removeElement是定义在list上,你根本不需要暴露listNode的细节,也不用暴露Head给外面,client也不需要知道head的存在的(当然这个跟你LintCode的题目要求已经不一样了,抛开lintcode,只从OOD角度来说),你的removeElement也好,insert也好,都是对着自己class的head操作,这样就不会出现你上面那个外人篡改自己的数据,而自己不知情的情况了。
下面是改后的代码。我主要是从正确使用OOD角度修改的,如果只是简单把你代码改的能过,不用这么大改动,但是那样的代码设计问题很大,将来保不定还会出别的怪bug。 |
|