LeetCode #83 删除排序链表重复项:我的代码为何无法生效?
排查LeetCode #83 删除排序链表中的重复元素代码失效问题
你的代码存在两个核心逻辑错误,导致无法正确过滤重复节点:
1. 判断条件逻辑错误
- 最初使用的
head != head.next是判断两个节点是否为同一个对象实例,而非值是否重复。链表中值相同的节点是不同的对象,因此这个条件永远为true(即使最后一个节点的head.next为null,head != null也成立),导致所有节点都被加入结果链表。 - 换成
head.val != head.next.val后,仍存在两个问题:- 当
head是最后一个节点时,head.next为null,访问head.next.val会触发空指针异常; - 你的逻辑没有跳过重复节点,只是判断当前节点与下一个节点值不同时才添加,但未处理「重复节点仅保留一个」的核心需求——每次循环都移动
head,导致重复节点被全部保留。
- 当
2. 结果链表拼接逻辑错误
无论if条件是否满足,你都会执行result = result.next,这会导致result指针无意义后移,甚至在未添加新节点时创建空节点;同时,你没有断开结果链表末尾与原链表的连接,最终输出的链表仍会携带原链表的重复节点。
对比正确代码的核心逻辑
正确代码直接在原链表上修改指针:
- 当当前节点与下一个节点值相同时,跳过下一个节点(
temp.next = temp.next.next); - 仅当值不同时,才移动当前指针,自然过滤掉重复项,无需额外创建链表,效率更高。
修正后的代码(保留新建链表的实现方式)
如果你想继续用新建链表的思路,可按以下逻辑修改:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == null) return null; ListNode trueResult = new ListNode(-1); ListNode result = trueResult; while (head != null) { // 跳过所有与当前节点值相同的重复节点 while (head.next != null && head.val == head.next.val) { head = head.next; } // 将当前唯一节点加入结果链表 result.next = head; result = result.next; // 移动到下一组不同值的节点 head = head.next; // 断开结果链表末尾的指针,避免残留原链表的重复节点 result.next = null; } return trueResult.next; } }
内容的提问来源于stack exchange,提问作者Surion
相关产品推荐
相关产品推荐

