Где здесь квадратичная сложность?

Дана задача. Нужно реализовать сериализацию и десериализацию связного списка. Сложность алгоритма должна быть не выше квадратичной. Ниже приведен код решения, проверяющие говорят что сложность алгоритма квадратична, но я не могу понять где именно. По идее в методах Serialize() и Deserialize() однократный проход по массивам, вложенных циклов нет, я делаю вывод, что сложность линейно зависит от количества входных данных. Или я чего то не понимаю?

    class ListNode
{
    public ListNode Prev;
    public ListNode Next;
    public ListNode Rand; // произвольный элемент внутри списка
    public string Data;
}

class ListRand
{
    public ListNode Head;
    public ListNode Tail;
    public int Count;

    public void Serialize(FileStream s)
    {
        List<ListNode> arr = new List<ListNode>();
        ListNode temp = new ListNode();
        temp = Head;

        //transform nodes into List
        do
        {
            arr.Add(temp);
            temp = temp.Next;
        } while (temp != null);

        //write into file; data is modify for store index of .Random node
        using (StreamWriter w = new StreamWriter(s))
            foreach (ListNode n in arr)
                w.WriteLine(n.Data.ToString() + ":" + arr.IndexOf(n.Rand).ToString());           
    }

    public void Deserialize(FileStream s)
    {
        List<ListNode> arr = new List<ListNode>();
        ListNode temp = new ListNode();
        Count = 0;
        Head = temp;
        string line;

        //try read file and create List of nodes
        try
        {
            using (StreamReader sr = new StreamReader(s))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    if (!line.Equals(""))
                    {
                        Count++; 
                        temp.Data = line;
                        ListNode next = new ListNode(); 
                        temp.Next = next; 
                        arr.Add(temp); 
                        next.Prev = temp;
                        temp = next;
                    }
                }
            }

            //declare Tail
            Tail = temp.Prev;
            Tail.Next = null;

            //return refs to Random nodes and restore Data
            foreach (ListNode n in arr)
            {
                n.Rand = arr[Convert.ToInt32(n.Data.Split(':')[1])];
                n.Data = n.Data.Split(':')[0];
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Failed to process data file, possibly it's corrupt, details:");
            Console.WriteLine(e.Message);
            Console.WriteLine("Press Enter to exit.");
            Console.Read();
            Environment.Exit(0);
        }
    }
}

Ответы (1 шт):

Автор решения: Qwertiy
foreach (ListNode n in arr) // первый проход
  arr.IndexOf(n.Rand) // вложенный проход
→ Ссылка