有序链表去重实现返回原头节点是否意味着修改了原链表?
有序链表去重代码疑问解答
你提供的实现代码如下:
function removeDuplicatesFromLinkedList(linkedList) { let currentNode = linkedList; console.log('currentNode', currentNode) while (currentNode) { let nextDifferentNode = currentNode.next; console.log('assignment', nextDifferentNode) while (nextDifferentNode && nextDifferentNode.value === currentNode.value) { nextDifferentNode = nextDifferentNode.next console.log('nextDifferentNode', nextDifferentNode) } currentNode.next = nextDifferentNode currentNode = nextDifferentNode } return linkedList }
两个疑问的对应解释如下:
- 是否修改了原链表节点的
.next属性?是
JavaScript中引用类型的传参是共享传值,你传入的linkedList是链表头节点的引用,后续赋值给currentNode的只是引用的副本,指向的还是内存中同一个节点对象。当执行currentNode.next = nextDifferentNode操作时,就是直接修改原节点的next指向,所以原链表的结构在函数运行过程中已经被原地修改了。 - 为什么还要返回
linkedList?是出于接口设计的考量,并非强制要求- 统一链表操作的接口规范:大部分链表工具函数都会默认返回处理后的头节点,哪怕这个场景下头节点不会被改动(有序去重不会删除头节点),也可以和反转链表、删除指定值节点等可能改动头节点的操作保持一致的使用习惯,降低使用者的理解成本。
- 支持链式调用:返回头节点的设计允许你直接编写
formatList(removeDuplicatesFromLinkedList(head))这类链式代码,不需要额外单独存储头节点变量。 - 适配更多使用场景:如果使用者不需要保留修改前的原链表,直接拿返回值就能得到去重后的结果,用法更灵活。
这个实现是典型的有序链表原地去重的最优解法,时间复杂度O(n),空间复杂度O(1),逻辑是正确的。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

