Объясните пожалуйста, почему здесь ConcurrentModificationException ?
package com.javarush.task.task22.task2209;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Locale;

/*
Составить цепочку слов
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        //...

        LinkedList<String> allwords = new LinkedList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String file = reader.readLine();
        file = "C:\\java\\JavaRush\\JavaRushTasks\\JavaRushTasks\\files\\2.txt";
        BufferedReader filereader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
        while (filereader.ready()) {
            allwords.addAll(Arrays.asList(filereader.readLine().split(" ")));
        }
        String[] words = allwords.toArray(new String[allwords.size()]);

        StringBuilder result = getLine(words);
        System.out.println(result);
    }

    public static StringBuilder getLine(String... words) {
        if (words == null || words.length == 0) return new StringBuilder("");
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < words.length; i++) {
            LinkedList<String> wordsList = new LinkedList<>(Arrays.asList(words));
            int bestCount = 0;
            StringBuilder sb = new StringBuilder();
            sb.append(wordsList.get(i));
            int count = after1(wordsList, sb);
            if (count > bestCount) {
                bestCount = count;
                result = sb;
            }
        }
        return result;
    }

    private static int after1(LinkedList<String> wordsList, StringBuilder sb) {
        int x = 0;
        int size = wordsList.size();
        for (int i = 0; i < size; i++) {
            for (String word : wordsList
            ) {
                String lastChar = sb.substring(sb.length() - 1, sb.length());
                if (word.toLowerCase(Locale.ROOT).startsWith(lastChar.toLowerCase(Locale.ROOT))) {
                    sb.append(" ").append(word);
                    x++;
                    wordsList.remove(word);
                }
            }
        }
        return x;
    }
}