请问我实现的双向链表remove方法是否正确?
双向链表remove方法的问题分析
你的代码能正常运行,但存在边界条件逻辑错误,会导致部分场景出现异常,具体问题和修正方案如下:
1. 错误的边界判断:range == this.length
链表的有效索引范围是 0 到 this.length - 1,当 range === this.length 时属于无效索引,应该返回undefined,但你现在会调用pop()(删除最后一个有效节点,对应索引this.length -1),这会导致用户传入无效索引时,错误地删除最后一个元素。
2. 越界判断不严谨:range > this.length
正确的越界条件应该是 range < 0 || range >= this.length——因为range === this.length已经超出了有效索引范围,原代码的判断会漏掉这个情况。
修正后的代码
调整边界条件后,正确的实现如下:
remove(range){ if(range === 0){ return this.shift(); } else if(range === this.length - 1){ // 修正:删除最后一个元素的正确索引是length-1 return this.pop(); } else if(range < 0 || range >= this.length ){ // 修正:越界条件包含range等于length的情况 return undefined; } else{ const temp = this.get(range); const after = temp.next; const before = temp.prev; before.next = after; after.prev = before; temp.next = null; temp.prev = null; this.length--; return temp; } }
额外注意事项
这个remove方法依赖shift()、pop()、get()三个方法的正确性:
shift()需要正确删除头节点,更新head指针和链表长度pop()需要正确删除尾节点,更新tail指针和链表长度get()需要能准确返回对应索引的节点
只要这三个方法实现无误,修正后的remove就可以正常工作。
内容的提问来源于stack exchange,提问作者Tanishq Kr. Kaushal
相关产品推荐
相关产品推荐

