2016-12-02 3 views
0

Я не вижу свою ошибку. Я использую список, в котором метод insert помещает каждый новый элемент в порядок. Я пытаюсь не использовать hashtables для этого случая. Я написал график потока управления, написал его на бумаге и, похоже, имеет смысл в этих средах, но я не могу получить результаты, которые я ищу. Мой список: 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; 
    }