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

时间:2015-07-10 10:40:19

标签: java data-structures linked-list

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

输入格式:

你必须完成Node * RemoveDuplicates(Node * head)方法,它接受一个参数 - 排序链表的头部。你不应该从stdin / console读取任何输入。

输出格式:

删除尽可能少的节点,以确保没有两个节点具有相同的数据。调整下一个指针以确保其余节点形成单个已排序的链接列表。然后返回已排序的更新链表的头部。

我的代码:

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;
}

测试时,除非最后一个节点的值等于上一个节点的值,否则它会完美运行。我无法在代码中找到错误。

测试结果:

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

问题from HackerRank

3 个答案:

答案 0 :(得分:1)

你只是没有完成循环。

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

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

你内在的while循环将返回true,你将进入else条件。

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

<强>修正: 设置n.next = null后,只需退出循环。

else{
    n.next = null;
    break;
}

答案 1 :(得分:0)

将内部while循环更改为

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

当你的最后两个节点相等时,你正在制作n.next=null;,但是你没有检查next是否为null,只需检查n.data&amp;&amp; test.data,导致问题。

答案 2 :(得分:-1)

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

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;
}