Если я правильно понял назначение, то вам нужно изменить порядок списка, когда первый узел должен быть не больше второго узла, а второй узел должен быть не меньше третьего узла и т. Д.
Если это так, то нет необходимости использовать оператор new для изменения порядка в списке.
Вот демонстрационная программа. Я внес небольшие изменения в определение списка. Например, узел структуры должен быть скрыт от пользователя списка. Он должен быть определен как закрытый элемент данных внутри определения списка.
#include <iostream>
#include <utility>
class linked_list
{
private:
struct node
{
int data;
node *next;
} *head = nullptr, *tail = nullptr;
public:
linked_list() = default;
void add_node( int data )
{
node *tmp = new node { data, nullptr };
if ( head == NULL )
{
head = tail = tmp;
}
else
{
tail = tail->next = tmp;
}
}
void reorder()
{
int direction = 0;
auto condition = [&direction]( const auto &a, const auto &b )
{
return ( direction ^= 1 ) ? b < a : a < b;
};
node **current = &head;
for ( ; *current && ( *current )->next; current = &( *current )->next )
{
if ( condition( ( *current )->data, ( *current )->next->data ) )
{
node * &next = ( *current )->next;
std::swap( *current, next );
std::swap( ( *current )->next, next->next );
}
}
tail = *current;
}
friend std::ostream & operator <<(std::ostream &os, const linked_list &list)
{
for ( const node *current = list.head; current != nullptr; current = current->next)
{
os << current->data << " -> ";
}
return os << "null";
}
};
int main()
{
linked_list list;
int a[] = { 1, 2, 3, 4, 5 };
for ( int data : a ) list.add_node( data );
std::cout << list << '\n';
list.reorder();
std::cout << list << '\n';
int b[] = { 6, 7, 8, 9, 10 };
for ( int data : b ) list.add_node( data );
std::cout << list << '\n';
list.reorder();
std::cout << list << '\n';
return 0;
}
Его вывод
1 -> 2 -> 3 -> 4 -> 5 -> null
1 -> 3 -> 2 -> 5 -> 4 -> null
1 -> 3 -> 2 -> 5 -> 4 -> 6 -> 7 -> 8 -> 9 -> 10 -> null
1 -> 3 -> 2 -> 5 -> 4 -> 7 -> 6 -> 9 -> 8 -> 10 -> null
Обратите внимание на то, что после переупорядочения списка необходимо настроить хвост указателя из списка. В противном случае добавление новых элементов в список может быть недопустимым.