Для замены двух узлов (a, b) вам необходим доступ к «внешнему» узлу (o), который указывает на первый. (и есть также узел p после a и b. (p также может быть NULL, но это не важно)
Старая ситуация:
o->next == a
a->next == b
b->next == p
Новая ситуация:
o->next == b
b->next == a
a->next == p
Этот обмен может быть выполнен только , если o на самом деле является узлом . (и поэтому: имеет указатель o-> next), поэтому вам понадобится специальный код для обработки случая, когда a является главой цепочки.
Но нет: o-> next - это только "struct list *", поэтому можно использовать любой указатель на список. В большинстве случаев простейшим решением является использование аргумента указатель-на-указатель для функции подкачки; указатель на указатель может указывать либо на начало цепочки, либо на указатель некоторого узла -> следующий.