Просто сохраните флаг направления, глобальный для списка, и переверните его, чтобы изменить направление списка. Определите ваш узел списка следующим образом:
struct node {
struct node *link[2];
bool *dir;
};
Указатель dir
каждого узла должен указывать на один объект bool
, общий для всего списка (например, в отдельной выделенной памяти). Тогда везде, где вы обычно обращаетесь к p->next
или p->prev
, вместо этого обращайтесь к p->link[*p->dir]
или p->link[!*p->dir]
соответственно. Теперь вы можете перевернуть смысл prev и next для всего списка, просто инвертировав флаг направления: *p->dir = !*p->dir;
.
Обратите внимание, что хранение указателя в каждом узле обходится дорого, и вы можете избежать этого просто сохраняя флаг отдельно «вне диапазона», но это ограничивает доступ к списку (по крайней мере, со знанием текущего направления) только там, где у вас есть эта информация вне диапазона; тогда вы не можете сделать это, начиная только с члена списка.