关于删除链表重复节点的问题

关于删除链表重复节点的一道题目,不知道是哪里的逻辑错误,又要如何修改呢

img

img

img


```java
public ListNode deleteDuplicates(ListNode head) {
        if(head==null||head.next==null)
        return head;
        ListNode s=new ListNode(-1,head);
        ListNode pre=s;//让pre与nextNode间隔一个节点
        ListNode nextNode=head.next;
        while(nextNode!=null){
            if(pre.next.val==nextNode.val){
                while(pre.next.val!=nextNode.val){
                nextNode=nextNode.next;
            }
            pre.next=nextNode;
            }
            else{
                pre=pre.next;
                nextNode=nextNode.next;
            }
        }
        return s.next;
    }

```

public ListNode deleteDuplicates(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode s = new ListNode(-1, head);
    ListNode pre = s; // 让pre与nextNode间隔一个节点
    ListNode nextNode = head.next;
    while (nextNode != null) {
        if (pre.next.val == nextNode.val) {
            while (nextNode != null && pre.next.val == nextNode.val) {
                nextNode = nextNode.next;
            }
            pre.next = nextNode;
        } else {
            pre = pre.next;
        }
        if (nextNode != null) {
            nextNode = nextNode.next;
        }
    }
    return s.next;
}

【以下回答由 GPT 生成】

这段代码的目标是删除链表中重复的节点。

在代码中,我们维护了两个指针,一个指向前一个不重复的节点(pre),一个指向当前节点的下一个节点(nextNode)。我们通过比较pre.next.val和nextNode.val来判断是否有重复节点,并且如果有重复节点,我们将pre.next指向nextNode,从而删除重复节点。

问题可能出在两个地方: 1. 当pre.next与nextNode值相同时,我们应该跳过所有相同值的节点,而不是只跳过一个。 2. 如果链表的最后几个节点是重复的,那么我们在找到第一个不重复的节点时,应该将该节点的下一个节点置为null。

以下是修复后的代码示例:

public ListNode deleteDuplicates(ListNode head) {
    if (head == null || head.next == null)
        return head;

    ListNode dummy = new ListNode(-1, head);
    ListNode pre = dummy;
    ListNode nextNode = head.next;
    while (nextNode != null) {
        if (pre.next.val == nextNode.val) {
            while (nextNode != null && pre.next.val == nextNode.val) {
                nextNode = nextNode.next;
            }
            pre.next = nextNode;
        } else{
            pre = pre.next;
            nextNode = nextNode.next;
        }
    }
    return dummy.next;
}

现在,我们通过比较pre.next.val和nextNode.val来判断是否有重复节点。如果有重复节点,我们会一直跳过相同值的节点,直到找到第一个不重复的节点,并将pre.next指向该节点。

修复后的代码应该可以正确地删除链表中的重复节点。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^