Код меняет направление указателей и это верный подход для реверса списка. Но вот только смущает строка
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);
}