Реализация IClonable для двусвязного списка

Есть класс двусвязного списка, выглядит так:

class DoublyNode<T>
{
    public DoublyNode(T data)
    {
        Data = data;
    }
    public T Data { get; set; }
    public DoublyNode<T> Previous { get; set; }
    public DoublyNode<T> Next { get; set; }
}

public class DoublyLinkedList<T>:IDeque<T>, IEnumerable<T>, ICloneable
{
    DoublyNode<T> head; // головной/первый элемент
    DoublyNode<T> tail; // последний/хвостовой элемент
    int count;  // количество элементов в списке
    
    //различные методы

        public object DeepClone()
    {
        DoublyNode<T> clonedHead = new DoublyNode<T>(head.Data)
        {
            Data = head.Data,
            Previous = head.Previous,
            Next = head.Next
        };
        DoublyNode<T> clonedTail = new DoublyNode<T>(tail.Data)
        {
            Data = tail.Data,
            Previous = head.Previous,    //вот в этих местах нужен какой-то цикл для обхода всех нодов
            Next = tail.Next
        };
        int clonedCount = Count();
        return new DoublyLinkedList<T>
        {
            head = clonedHead,
            tail = clonedTail,         //и здесь
            count = clonedCount
        };
    }
    public object Clone()
    {
        return DeepClone();
    }
}

Необходимо реализовать метод Clone() интерфейса ICloneable. Я написал его в методе DeepClone, но работает он не совсем правильно, так как у каждого нода DoublyNode есть информация о предыдущем и следующем ноде, которая хранится в точно таком же ноде, у которого точно также есть информация и так далее до конца списка можно уходить вглубь.

Как я понял, здесь нужно циклом как то рекурсивно с проверкой на null обойти все ноды.

Если нужен весь код класса, я отредактирую.


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

Автор решения: Mikkel Ontberg
public object Clone()
    {
        DoublyLinkedList<T> clone = new DoublyLinkedList<T>();
        foreach(T element in this)
        {
            clone.AddLast((T)element.Clone());
        }
        return clone;
    }

Где AddLast():

 public void AddLast(T data)
    {
        DoublyNode<T> node = new DoublyNode<T>(data);

        if (head == null)
            head = node;
        else
        {
            tail.Next = node;
            node.Previous = tail;
        }
        tail = node;
        count++;
    }

Также перед этим нужно ограничить T чтобы он наследовал IClonable

→ Ссылка