2015-09-12 2 views
0

В качестве части назначения мне необходимо написать метод, который будет печатать повторяющиеся значения в связанном списке, а также сколько раз они происходят. Ниже приведен метод printRepeats(), который использует вспомогательный метод countRepeats(ListNode node).Java - подсчет случаев в связанном списке

Проблема в том, что выходные данные моего метода повторяют повторяющиеся значения снова и снова. Например, в списке со значениями 1 1 1 2 3 4 5 6 7 6 выход равен 1 (Occurences = 3) 1 (Occurences = 3) 1 (Occurences = 3) 6 (Occurences = 2) 6 (Occurences = 2). Любое значение, которое повторяется, должно печатать только один раз. Какие-либо предложения? Заранее спасибо!

public class LinkedList 
{ 
    private ListNode first; 

    public void printRepeats() 
    { 
     String ans = ""; 
     ListNode temp = first; 
     while(temp != null) 
     { 
      if(countRepeats(temp) > 1 && ans.indexOf((int)temp.getValue()) == -1) 
      { 
       ans += temp.getValue(); 
       System.out.print(temp.getValue() + " (Occurences = " + countRepeats(temp) + ") "); 
      } 
      temp = temp.getNext(); 
     } 
     if(ans.length() == 0) 
      System.out.print("None of the elements repeat."); 
    } 

    private int countRepeats(ListNode node) 
    { 
     ListNode temp = first; 
     int count = 0; 
     while(temp != null) 
     { 
      if((int)temp.getValue() == (int)node.getValue()) 
       count++; 
      temp = temp.getNext(); 
     } 
     return count; 
    } 
} 
+0

Используйте HashMap , где ключ - это число в списке, а значение - его количество. –

+0

Какая у вас спецификация? Имеете ли вы какие-либо ограничения времени выполнения или можете использовать другую структуру данных для решения этой проблемы? – CRC

+0

@CRC Не может быть использована структура данных, отличная от связанного списка; что касается пределов времени выполнения, код должен быть максимально эффективным, но это не является главной задачей. – Abhi

ответ

0

Учитывая, что вы не должны использовать какие-либо другие структуры данных, чем LinkedList, вы можете:

  • Создайте еще один ListNode элемент как первый элемент списка под названием «repeatedElements», которая должна содержать пары элемент/повторения такого элемента.
  • При подсчете повторений одного элемента вставьте элемент и количество повторений, которые он имеет в списке «repeatElements».
  • Перед подсчетом количества повторений элемента разверните список повторяющихся элементов для элемента. Если элемент присутствует, НЕ распечатывайте вывод. Если это не так, повторите свой код, как обычно.

Система, которую я описал, будет содержать больше информации, чем требуется (количество повторений каждого элемента сохраняется), но вполне вероятно, что она понадобится снова.

+0

Зачем мне нужно хранить количество повторений _and_ значение? Не могу ли я просто сохранить значение, которое повторяется, и пропустить «повторную повторную процедуру» каждой итерации, чтобы убедиться, что мой текущий элемент не находится в 'repeatElements'? Основываясь на моих текущих знаниях, я думаю, что то, что вы говорите, потребует Doubly LinkedList, который еще не изучен. – Abhi

+0

Это правда, вы НЕ ДОЛЖНЫ включать обе данные в связанный список, хотя это было бы хорошей практикой, чтобы избежать перерасчета в будущем.Однако для хранения обоих значений вам не нужен двойной связанный список. Связанный список - это структура отображения, которая указывает на ряд ячеек, содержащих значения. Каждая ячейка может содержать любое количество значений. Объект ListNode может хранить, например, объект или массив вместо целого. – jFRAF

Смежные вопросы