2014-11-09 2 views
0

Так что я должен написать функцию для удаления узла с последовательными одинаковыми элементами. Например: {1,1,1,2,3,3,4} становится: {1,2,3,4} Я написал следующий код, не могу понять, что с ним не так. Он работает только для первых нескольких элементов.Удаление последовательных одинаковых элементов в списке ссылок

public void deleterepetitive() 
    { 
     Node itr = head; 
     Node itrfront=itr.getNext(); 

     while(itr.getNext()!=null) 
     { 

      if(itr.getItem()==itrfront.getItem()) 
      { 
       itr.setNext(itrfront.getNext()); 
      } 
      itr = itr.getNext(); 
      itrfront = itrfront.getNext(); 

     } 

Любая помощь будет оценена по достоинству.

+0

возможно дубликат [Удалить дубликаты записей в списке двусвязного] (http://stackoverflow.com/questions/26823759/remove-duplicate-entries -in-the-doubly-linked-list) – Dici

ответ

0

Изменить линию itrfront = itrfront.getNext(); к itrfront = itr.getNext(); внутри цикла. Я думаю, ваш код ломается после первого дублирования упущения.

Изменение, если блок, как показано ниже: (нам необходимо проверить новый следующий пункт и не пропустить его.)

if(itr.getItem()==itrfront.getItem()) 
{ 
    itrfront = itrfront.getnext();  
    itr.setNext(itrfront); 
    continue;  
} 

Ранее вы код был

первой итерации:

1  1  1 1 1 2  3  3  4 
^ ^
ITR NExt 

duplicate fond so remove node

второй итерации:

1  1  1 1 2  3  3  4 
    ^ ^
    ITR NExt 
0

есть много способов сделать это.

Я нахожу либо перешагнув список со дна (начиная с элемента N'th и итерации до нулевого элемента), либо беря коллекцию и вставляя ее в коллекцию Set, чтобы заставить коллапс одинаковых значений также работает.

веселит

+0

Можете ли вы взглянуть на мой фрагмент кода? Я не знаю, что не так с моей логикой –

0

Вы не увеличивающиеся ваши итераторы правильно, вы хотите itrfront, чтобы всегда быть впереди ITR, но на самом деле на нем: Пусть ITR быть: ^, itrfront быть: а и itr.getNext() быть: п, это то, что происходит:

n 
1 1 1 2 2 2 2 3 
^ A 

    n 
1 1 1 2 2 2 2 3 
^ A 

     n 
1 *1* 1 2 2 2 2 3 
    ^
     A 

     n 
1 *1* 1 2 2 2 2 3 
    ^
     A 

     n 
1 *1* 1 2 2 2 2 3 
     ^
     A 

, где * 1 * означает мусор собирали

Что вы хотите сделать что-то вроде этого:

while(itr.getNext()!=null) 
{ 
    while(itr.getItem()==itrFront.getItem()) 
    { 
     itrfront = itrfront.getNext(); 
    } 
    itr.setNext(itrfront); 
    itr = itr.getNext(); 
    itrfront = itr.getNext(); 
} 
Смежные вопросы