You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有序链表去重实现返回原头节点是否意味着修改了原链表?

有序链表去重代码疑问解答

你提供的实现代码如下:

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?是出于接口设计的考量,并非强制要求
    1. 统一链表操作的接口规范:大部分链表工具函数都会默认返回处理后的头节点,哪怕这个场景下头节点不会被改动(有序去重不会删除头节点),也可以和反转链表、删除指定值节点等可能改动头节点的操作保持一致的使用习惯,降低使用者的理解成本。
    2. 支持链式调用:返回头节点的设计允许你直接编写formatList(removeDuplicatesFromLinkedList(head))这类链式代码,不需要额外单独存储头节点变量。
    3. 适配更多使用场景:如果使用者不需要保留修改前的原链表,直接拿返回值就能得到去重后的结果,用法更灵活。

这个实现是典型的有序链表原地去重的最优解法,时间复杂度O(n),空间复杂度O(1),逻辑是正确的。


内容的提问来源于stack exchange,提问作者dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:36:04