链表删除指定位置节点:返回head/llist为何均正确?
关于HackerRank「删除链表指定位置节点」返回值的疑问解答
核心原因:测试逻辑基于返回值,而非传入引用的修改
HackerRank这道题的测试是通过接收函数返回的节点作为新链表头来验证结果的,不管你函数内部怎么处理传入的参数,只要返回的是正确的头节点,就能通过测试。具体分两种场景看:
删除非头节点(position > 0)
这种情况下我们只需要找到目标节点的前一个节点,修改它的next指针跳过目标节点就行。整个链表的头节点没有任何变化——你定义的head和传入的llist都是指向原头节点的引用,所以返回两者任意一个都是正确的原头,测试自然通过。这时候你看到head没被修改是完全正常的,因为根本不需要改动头节点。删除头节点(position = 0)
这时候正确的做法是返回原头节点的next作为新头。如果你的代码逻辑里,在这个分支直接返回了llist.next(或者head.next,因为head本质是llist的别名),那么不管你写return head还是return llist,这个分支返回的都是正确的新头;而其他场景返回原头,两种返回方式自然都能覆盖所有测试用例。
额外补充:JavaScript的引用传递细节
JavaScript里对象(包括链表节点)的参数是按引用副本传递的:
- 如果你修改的是节点的属性(比如
current.next = current.next.next),会直接影响原链表的结构; - 但如果是重新赋值函数内部的变量(比如
llist = llist.next),只是改了函数内部的引用副本,不会影响外部的原变量。
但因为测试只看返回值,所以只要返回的节点是正确的头,就不会有问题。
内容的提问来源于stack exchange,提问作者Evan Scallan
相关产品推荐
相关产品推荐

