Вот грубый набросок гораздо более простой версии, предполагая, что Node имеет члены «Next» и «Data»:
for (Node n = head; n && n.Next; n = n.Next.Next) {
void* tmp = n.Data;
n.Data = n.Next.Data;
n.Next.Data = tmp;
}
Другими словами, остановитесь на каждом другом узле в списке и поменяйте местами его данные со следующим (одним). Простой.
Редактировать: Приведенное выше решение меняет данные внутри узлов, но не самих узлов. Если вы хотите поменять местами фактические узлы, решение требует больше логики.