2016-12-02 94 views
0

我看不到我的错误。我使用了一个插入方法将每个新元素按顺序添加的列表。我正在尝试不使用哈希表来处理这种情况。 我写了一个控制流程图,写在纸上,它似乎在这些媒体中有意义,但我无法得到我期待的结果。 我的列表:0,1,1,1,2,4,5,7 这是完全一样的我通过这种方法运行后:删除链接列表中的重复项

public class List { 

int value; 
List next; 

List(int value, List next) { 
    this.value = value; 
    this.next = next; 
} 

} 
public void deleteDuplicates() { 
    List marker = head; 
    List pointer = marker; 

    while(marker != null && marker.next != null){ 
     while(pointer.next != null){ 
      if(marker.value == pointer.next.value){ 
       pointer.next = pointer.next.next; 
      } 
      else{ 
       pointer = pointer.next; 
      } 
     } 
     marker = marker.next; 
    } 
} 
+1

'next'和'value'看起来怪怪的。你做了你自己的列表课程吗?我很确定'LinkedList'中没有这些名字的字段。 – Gendarme

+0

是的,这是为了学习它是如何工作的。与使用java提供的类相反,我使用了我自己的列表。值是列表中的元素,接下来是引用指针。 – Shaun

+1

我想我们需要看看你的班级。提供[mcve]。 – Gendarme

回答

0

你是不是结束后重置pointer变量内循环:marker = marker.next;后,你应该添加pointer = marker;

而且Node似乎一个更好的名字,而不是List

0

您的代码问题是您有两个指针(和pointer),但没有使用第二个指针(pointer)。如果你碰到相同的值,你会增加指针,但最终会丢掉pointer而不使用它。

一个更简洁的方式来消除重复情况如下 -

List marker=head; 
    List pointer; 

    while(marker != null && marker.next != null){ 
     pointer = marker.next; 
     while(pointer != null && marker.value == pointer.value){ //Skip nodes which have same value 
       pointer = pointer.next; 
     } 
     marker.next = pointer; 
     marker = marker.next; 
    }