Перевернуть двусвязный список между заданными узлами

0

Пытается поменять элементы связанных списков, указав указатели на заданные узлы в связанном списке. Например, мне будет присвоен указатель на 4-й и указатель на 7-й узел в связанном списке и придется перевернуть узлы между этими узлами. Вот какой-то соответствующий код, который не работает:

template <class T>
void List<T>::reverse( ListNode * & startPoint, ListNode * & endPoint ){

  if (startPoint == NULL)  
    return;

  if (startPoint->prev != NULL)
    startPoint->prev->next = endPoint;

  if (endPoint->next != NULL)
    endPoint->next->prev = startPoint;

  ListNode * curr = startPoint;
  ListNode * temp = startPoint;

  while(curr != endPoint)
  {
    temp = curr->next;
    curr->next = curr->prev;
    curr->prev = temp;
    curr = temp;
  }

  temp = endPoint->next;
  endPoint->next = endPoint->prev;
  endPoint->prev = temp; 

  temp = startPoint->next;
  startPoint->next = endPoint->next;
  endPoint->prev = startPoint->prev;

  temp = startPoint;
  startPoint = endPoint;
  endPoint = temp;

} 

Этот код компилируется, но не выполняет обратные узлы правильно, и я не уверен, почему.

Теги:
doubly-linked-list
reverse

1 ответ

0

Я не пробовал кодировать это, но алгоритмически это должно быть довольно быстро;

1) сначала со всех узлов между начальным и конечным положениями вашего подписок подменю значения для prev и next. Это приведет к инвертированию порядка всех узлов между ними. Оставляя только граничные узлы.

2) После замены следующего и prev во всех положениях также замените обновленный следующий из исходного стартового узла обновленным prev из исходного конечного узла. Теперь эти узлы будут указывать на правильный остаток последовательности.

3) для управления также обновлять узлы, расположенные за пределами последовательности, правильно.

Пример (узел показан как "NODE (PREV, NEXT)")

A(0,B) - B(A,C) - C(B,D) - D(C,E) - E(D,F) - F(E,-)

реверсивный узел 1 - 4 (B - E)

Первый шаг:

A(0,B) - B(C,A) - C(D,B) - D(E,C) - E(F,D) - F(E,-)

второй

A(0,B) - B(C,F) - C(D,B) - D(E,C) - E(A,D) - F(E,-)

третий

A(0,E) - B(C,F) - C(D,B) - D(E,C) - E(A,D) - F(B,-)

И теперь, чтобы визуализировать заказ:

A(0,E) - E(A,D) - D(E,C) - C(D,B) - B(C,F) - F(B,-)

И вот он, отменил средние 4 узла.

  • 0
    Я считаю, что это то, что делает мой код, но он не может полностью перевернуть список ...
  • 0
    Это немного сложно читать, было бы проще, если бы вы использовали std :: swap. Но в любом случае, вы делаете только первый шаг, а не второй и третий. Обратите внимание на шансы от B (C, A) и E (F, D) до B (C, F) и E (A, D)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню