
在有序链表去重算法中,`t1.next = null` 是确保结果链表尾部正确截断的必要操作;若省略,会导致残留冗余节点或悬空指针,引发逻辑错误或运行时异常。
该算法采用双指针(t1 和 t2)遍历有序链表,核心思想是:t1 指向已确认保留的最后一个唯一节点,t2 向后扫描跳过所有与 t1.data 相同的重复节点;一旦遇到不同值,就将 t1.next 指向 t2,并推进 t1。
但关键在于——循环终止条件仅依赖 t2 == null。这意味着当 t2 扫描至链表末尾(即 null)时,t1 仍指向最后一个被保留的节点,而它的 next 指针可能仍指向原链表中已被“跳过”的重复节点(即逻辑上应被截断的部分)。
例如,对链表 1 → 2 → 3 → 3 → null 执行算法:
- 初始:t1 指向 3(第一个 3),t2 指向第二个 3;
- 第一次比较:t1.data == t2.data → t2 = t2.next(t2 变为 null);
- 循环结束,此时 t1 仍指向第一个 3,其 next 仍为第二个 3(即 t1.next 未更新,仍指向原冗余节点);
- 若不执行 t1.next = null,返回的链表实际为 1 → 2 → 3 → 3 → null,去重失败。
因此,循环结束后必须显式置空:
t1.next = null;
这一步完成了最终的“逻辑截断”,确保 t1 成为新链表真正的尾节点。
⚠️ 注意事项:
- 该操作不可省略,否则即使算法逻辑看似完成,输出链表仍包含未清除的重复尾部;
- 它只在 while 循环自然退出(t2 == null)后生效,不适用于空链表或单节点链表(但代码中已有前置判空,安全);
- 此技巧依赖于链表有序前提;若输入无序,需先排序或改用哈希集合去重。
总结:t1.next = null 不是防御性编程的冗余语句,而是算法正确性的最后闭环——它把“逻辑上已跳过的重复段”从链表结构中彻底剥离,确保返回链表严格满足“无重复、无冗余、结构完整”的要求。










