Дублированный связанный список - PullRequest
0 голосов
/ 08 мая 2019

Я хочу дублировать элементы в связанном списке. Вот что я попробовал:

public class duplicate  {
      public static void main(String[] args) {

        LinkedList <Integer> list = new LinkedList<Integer>() ;
        list.add(2); 
        list.add(3); 
        list.add(4); 
        list.add(1); 
        list.add(0); 

        for( int i= 0 ; i<list.size(); i++) {   
          list.addAll(list);
          System.out.println(list);
          break; 
        }

      }
    }

Но я получил бесконечный цикл.

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Добавляет все элементы в указанной коллекции к концу этот список, в том порядке, в котором они возвращаются указанным итератор коллекции (необязательная операция) (...)

Итак, просто сделав это все в порядке:

LinkedList <Integer> list = new LinkedList<Integer>() ;
//... code omitted (adds every number)
list.addAll(list);
  • Однако, если вы хотите использовать List.add вместо List.addAll, вы можете сделать это как это (необходимо использовать для цикла * 1 047 *):

    LinkedList <Integer> list = new LinkedList<Integer>() ;
    //... code omitted (adds every number)
    int initialSize = list.size();
    for( int i = 0 ; i < initialSize; i++) {   
      list.add(list.get(i));
    }
    
    System.out.println(list);
    
0 голосов
/ 08 мая 2019

Вы можете просто выполнить list.addAll(list);.

Если вы хотите использовать метод add в качестве упражнения, вам нужно быть осторожным, чтобы сохранить исходный размер списка, прежде чем начать итерацию.Вы можете сделать это в части инициализации вашего цикла for:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>(Arrays.asList(2, 3, 4, 1, 0));
    for (int i = 0, size = list.size(); i < size; i++)
        list.add(list.get(i));
    System.out.println(list);
    assert list.equals(Arrays.asList(2, 3, 4, 1, 0, 2, 3, 4, 1, 0));
}

Теперь вы заметите, что выше используется ArrayList, а не LinkedList.В общем, вы должны предпочесть ArrayList.Даже автор Java LinkedList говорит, что он не использует .См. Также этот вопрос об ArrayList против LinkedList .

Если у вас есть для использования LinkedList, вы можете просто заменить вторую строку из приведенного выше на эту:

    List<Integer> list = new LinkedList<>(Arrays.asList(2, 3, 4, 1, 0));

Остальная часть кода может остаться без изменений.Однако, если у вас очень длинный список, то использование метода get(index) класса LinkedList может снизить производительность.С LinkedList вы получаете более высокую производительность, если вы выполняете итерацию (используя LinkedList.iterator() или , улучшенную для цикла , чем при использовании обычного цикла for с вызовами get(). Но вы не можете выполнять итерацию по списку, покадобавив к нему, вы получите ConcurrentModificationException, вместо этого вы можете скопировать связанный список в массив и выполнить итерацию по нему, добавляя в список:

public static void main(String[] args) {
    List<Integer> list = new LinkedList<>(Arrays.asList(2, 3, 4, 1, 0));
    for (Integer element : list.toArray(new Integer[0])) {
        list.add(element);
    }
    System.out.println(list);
    assert list.equals(Arrays.asList(2, 3, 4, 1, 0, 2, 3, 4, 1, 0));
}
0 голосов
/ 08 мая 2019

вы добавляете элементы списка снова и снова в цикле for.

for(int i= 0 ; i < list.size(); i++) {   
   list.addAll(list);
   System.out.println(list);
}

Каждый раз, когда он будет расти, что приведет к увеличению размера для каждой итерации. исправьте шаг. Либо используйте локальную переменную для хранения размера, либо измените логику

...