Здравствуйте, SemiCoder, Вы писали:
SC>сделать Reverse Single Linked List.
SC>Я обрадовался...И потом начал кодировать на доске.
Ошибка в последнем предложении.
Не нужно сразу начинать кодировать — сначала подумать, а лучше — нарисовать, особенно если не помните решение задачи наизусть.
Задача довольно необычна т.к. в большинстве случаев используется двунаправленный список.
Кодинг сразу — ненужный выпендрёж. Более того, я бы спросил, что мы вообще пишем, внешний код по отношению к списку, или метод списка?
Потом бы обязательно представил, или написал то, как будет выглядеть элемент списка.
class SingleLinkedListNode<T>
{
public T Value;
public SingleLinkedListNode<T> Tail;
}
Если вот так нарисовать, то сразу станет очевидным, что голову в хвост засовывать — ошибка.
| Скрытый текст |
| SingleLinkedList<AnyT> TargetList;
{
SingleLinkedListNode tail = TargetList.Tail;
while (tail != TargetList.head)
{
LinkedListNode head = TargetList.Head;
TargetList.Add ( head );
TargetList.RemoveNode ( head ); //Предполагаем, что поиск нода начинается с головы.
}
}
|
| |
Вот так похоже на правду, но как-то коряво...
SingleLinkedList<AnyT> TargetList;
{
SingleLinkedList<AnyT> result = new SingleLinkedList<AnyT>();
while (TargetList.Head != null)
{
result.Add(TargetList.Tail)
TargetList.RemoveNode ( TargetList.Tail );
}
}
В конце-концов смотрим на рисунок и пишем метод:
public void Reverse()
{
SingleLinkedListNode<T> tail = m_head;
LinkedListNode head = tail;
while (m_head != null)
{
SingleLinkedListNode<T> tmp = new SingleLinkedListNode<T>();
tmp.Value = m_head.Value;
tmp.Tail = head;
head = tmp;
RemoveHead();
}
}
Кстати, двунаправленный список может быть написан так, что его реверс будет иметь сложность O(1).