问题陈述: 从已排序的链接列表中删除重复值节点
输入格式:
你必须完成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是列表中的节点数。
答案 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;
}