Re: Забыл как делать Reverse Linked List
От: Философ Ад http://vk.com/id10256428
Дата: 13.09.12 07:34
Оценка:
Здравствуйте, 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).
Всё сказанное выше — личное мнение, если не указано обратное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.