我从排序链表中删除重复值节点的代码有什么问题?

What's wrong with my code to delete duplicate-value nodes from a sorted linked list?

问题陈述: 从排序链表中删除重复值节点

输入格式:

您必须完成 Node* RemoveDuplicates(Node* head) 方法,该方法接受一个参数 - 已排序链表的头部。您不应该阅读来自 stdin/console.

的任何输入

输出格式:

删除尽可能少的节点,保证没有两个节点有相同的数据。调整next指针,保证剩下的节点组成一个单一的排序链表。然后return排序后的更新链表的头部

我的代码:

Node RemoveDuplicates(Node head) {   
    Node n  = head;
    while(n.next!=null){
        Node test = n.next;
        while(n.data==test.data){
            if(test.next!=null){
                n.next = test.next;
                test = n.next;
            }
            else{
                n.next = null;
            }
        }
        if((n.next!=null)){
            n = n.next;
        }
    }
    return head;
}

经测试,它运行完美,除非最后一个节点的值等于前一个节点的值。我在我的代码中找不到错误。

测试结果:

第一个整数是测试用例的数量,第二个整数是列表中的节点数。

已解决问题 from HackerRank

将内部 while 循环更改为

    while(n.next!=null && n.data==test.data){
       .....
    }

当你的最后两个节点相等时,你正在 n.next=null; 但你不检查 next 是否为空,只是检查 n.data && test.data,这导致了问题。

你只是没有完成循环。

让我们调试在这种情况下会发生什么,

n.data = 15;
n.next = test;
test.data = 15;
test.next == null;

您的内部 while 循环将 return 为真,您将进入 else 条件。

您正在设置 n.next = null 并继续循环。 但循环条件保持不变...所以它会进入无限循环

修复: 设置 n.next = null.

后跳出循环即可
else{
    n.next = null;
    break;
}

代码也太复杂了。试试这个(现在无法测试):

Node RemoveDuplicates(Node head) {   
    if (head == null) return null;
    Node prev  = head;
    Node curr = head.next;
    while(curr != null){
        if (prev.data == curr.data)
            prev.next = curr.next;
         else
             prev = prev.next;
         curr = curr.next;
    }
    return head;
}