2012-09-28 18 views
0

所以我有一个列表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标签一起?我首先想到它可能已经被缠绕/缠绕,但意识到我没有做任何这样的事情。关于逻辑流程的建议?

+6

'&& currNode.next!= null'在while条件下....删除。这是忽略了最后一个元素。 – st0le

+0

,如果(iter.value == currNode.next.value) 这并不意味着它不能处理currNode.next.value为空并且我必须写出它的情况下,它给了我一个空指针例外 分别? – Xavier

+0

请参阅'shg'答案来解决这个问题。 – st0le

回答

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

,如果(iter.value == currNode.next.value)给我一个空指针异常,这不意味着它不能处理currNode.next.value为空的情况,我必须单独写出它? – Xavier

+0

这很奇怪,我遵循你的逻辑,但它肯定是错误的 - 我仍然在同一行中得到NullPointerException – Xavier

+0

你能编辑问题并更新/添加你更改的代码和你得到错误的行吗? – Rndm

0

Node currNode = iter; =>Node currNode = iter.next; //从下一个节点检查开始

while (currNode != null && currNode.next != null) =>while (currNode != null) //不检查空节点