Пытается поменять элементы связанных списков, указав указатели на заданные узлы в связанном списке. Например, мне будет присвоен указатель на 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;
}
Этот код компилируется, но не выполняет обратные узлы правильно, и я не уверен, почему.
Я не пробовал кодировать это, но алгоритмически это должно быть довольно быстро;
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 узла.