Реализация 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