C/C++

Проверьте функцию. МАТЕМАТИКА

Пару лет назад написал класс - замкнутый(или зацикленный) двунаправленный список.

Сейчас смотрю и не понимаю вот это

 void reverse() 
{
if (!m_head)
return;
ListNode* tail = m_head->m_left;
ListNode* curr = m_head;
while (true)
{
auto l = curr->m_left;
auto r = curr->m_right;

curr->m_left = r;
curr->m_right = l;

if (curr == tail)
break;
curr = r;
}
m_head = tail;
}
Этот метод действительно делает типа переворот списка? Может быть я ошибку где-то допустил? Что-то не верится что это работает, но я помню - работало.

МАТЕМАТИКА!
ПрОгРаМмИрОвАнИе эТо МаТеМаТиКа!!1
по моему просто выполняет сдвиг
ВП
Вадим Плехоткин
51 416
Лучший ответ
Код меняет направление указателей и это верный подход для реверса списка. Но вот только смущает строка
 ListNode* tail = m_head->m_left; 
Если вы откроете для себя глобальную функцию std::swap из заголовочного файла <utility> и познаете прелесть ссылок на указатели, то ваша жизнь станет намного ярче и насыщеннее!
 #include  

using namespace std;

template
struct Node {
T data;
Node* prev;
Node* next;
Node() : data(T()), prev(nullptr), next(nullptr) {}
};

template
void pointers_swap(Node* ptr) {
auto tmp = ptr->next;
ptr->next = ptr->prev;
ptr->prev = tmp;
}

// Вот он ваш реверс двусвязного линейного списка
void reverse(Node*& head, Node*& tail) {
// Если список пуст либо в списке всего один элемент
if (head == nullptr || head == tail) return;
swap(head, tail);
// Если в списке всего два элемента
if (head->next == tail) return;
// Если в списке более двух элементов
auto begin = tail->next;
while (begin != nullptr) {
pointers_swap(begin->prev);
begin = begin->next;
}
pointers_swap(head);
}

void show(const Node* head, const Node* tail) {
auto begin = head;
auto end = tail->next;
while (begin != end) {
cout data next;
}
puts("");
}

int main() {
auto head = new Node;
auto node1 = new Node;
auto node2 = new Node;
auto tail = new Node;

head->next = node1;
head->data = 1;

node1->prev = head;
node1->next = node2;
node1->data = 2;

node2->prev = node1;
node2->next = tail;
node2->data = 3;

tail->prev = node2;
tail->data = 4;

show(head, tail);
reverse(head, tail);
show(head, tail);
}
АС
Андрей Сугак
75 857
А если не выпендривался бы с плюсами, то всё было бы нормально.