所以我有一个0.1,3.0,4.5,-1,3.0,-10.0,3.0,3.0的清单 我应该在以下代码之后获得0.1,3.0,4.5,-1.0,-10.0的列表
public void removeDuplicates()
{
if (head == null)
return;
Node iter = head;
while (iter != null)
{
Node currNode = iter;
while (currNode != null && currNode.next != null)
{
if (iter.value == currNode.next.value)
{
currNode.next = currNode.next.next;
nItem--;
}
currNode = currNode.next;
}
iter = iter.next;
}
}
我甚至已经有一段时间了,直到我修理了一些东西并运行它,然后在这里意识到出了问题。
因为我现在得到0.1,3.0,4.5,-1.0,-10.0,3.0。为什么最后的3.0标记?我首先想到它可能已被环绕/缠绕,但意识到我没有做任何类似的事情。关于逻辑流程的建议?
答案 0 :(得分:1)
在您的代码中,while (currNode != null && currNode.next != null)
currnode.next != null
实际上会忽略检查最后一个节点,因此删除它。
修改:
此外,您还必须更改第if (iter.value == currNode.next.value)
行
因为现在它将尝试检查最后一个节点currNode.next = null
。因此,您必须将其更改为:
if (currNode.next != null && iter.value == currNode.next.value)
总的来说,您应该从下一个节点开始检查,即:currNode = iter.next,保留前一个指针并更改检查相等性的条件,如下所示:
public void removeDuplicates()
{
if (head == null)
return;
Node iter = head;
while (iter != null)
{
Node prevNode = iter;
Node currNode = iter.next;
while (currNode != null)
{
if (iter.value == currNode.value)
{
prevNode.next = currNode.next;
nItem--;
} else {
prevNode = currNode; //updating prevNode in case of not a match
}
currNode = currNode.next;
}
iter = iter.next;
}
}
答案 1 :(得分:0)
Node currNode = iter;
=> Node currNode = iter.next;
//检查从下一个节点开始
while (currNode != null && currNode.next != null)
=> while (currNode != null)
//不检查空节点