我从排序链表中删除重复值节点的代码有什么问题?
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;
}
问题陈述: 从排序链表中删除重复值节点
输入格式:
您必须完成 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;
}