C++双向链表insert前插返回新节点、add后插返回this的原因是什么
双向链表insert与add返回值差异原因
这个返回值的设计是和接口的使用场景强绑定的,目的是简化两种高频操作的代码逻辑,避免手动维护头指针出错:
insert返回新节点n的原因
insert的语义是往当前节点的前面插入新节点,最常见的使用场景就是头插:你拿着链表头指针,不断往头部加新节点。
看main函数里的用法:
Link* norse_gods = new Link{"Thor"}; norse_gods = norse_gods->insert(new Link{"Odin"});
你往头节点Thor前面插Odin之后,Odin变成了新的头节点。insert直接返回新节点Odin,你把返回值赋值给原头指针norse_gods,一步就完成了头指针的更新。如果insert返回this(也就是原头节点Thor),赋值后norse_gods还是指向Thor,前面插的Odin就会因为没有指针指向它直接丢失。
add返回当前节点this的原因
add的语义是往当前节点的后面插入新节点,最常见的使用场景就是保持头指针不变的尾追加:你拿着头指针,不断往链表尾部加新节点,不需要改动头指针。
看main函数里的用法:
Link* greek_gods = new Link{"Hera"}; greek_gods = greek_gods->add(new Link{"Athena"});
你往Hera后面插Athena之后,头节点还是Hera。add返回this(也就是原节点Hera),赋值后greek_gods还是指向原来的头节点,整条链表完整。如果add返回新节点Athena,赋值后greek_gods就指向了Athena,前面的Hera就会因为没有指针指向它直接丢失。
能不能统一返回值?
当然可以,返回值的设计只是接口约定,不是语法强制要求。只是统一之后你需要调整使用逻辑,不能直接照搬现有main函数的写法:
- 如果让insert也返回this:头插时不能用返回值覆盖头指针,要手动将新节点赋值给头指针
- 如果让add也返回n:尾追加时不能用返回值覆盖头指针,要单独保存头指针的初始值不被修改
现有设计的优势刚好匹配了两种最常用的操作习惯,减少了使用者的额外代码量,也降低了指针写错的概率。
内容的提问来源于stack exchange,提问作者kino
相关产品推荐
相关产品推荐

