swap() - это rotate() для двух элементов. Такое обобщение помогает легче понимать работу некоторых алгоритмов, которые иначе могут быть написаны крайне запутано. Также полезной штукой при работе с деревьями и списками является использование указателей на указатели - это я еще из
Лакоса помню (непонятно, как такая вещь, связанная чисто с реализацией, затесалась в книгу про дизайн, но тем не менее). Использование указателей на указатели позволяет избежать некоторых проверок и условий (меньше условий - меньше тестов надо писать).
Использование обоих идей позволяет, например, кратко и понятно выразить решение "классической" задачи с собеседований про переворот односвязного списка на месте:
typedef struct list_node_t {
int value;
struct list_node_t* next;
} list_node_t;
void rotate_right(list_node_t** v1, list_node_t** v2, list_node_t** v3)
{
list_node_t* t = *v3;
*v3 = *v2;
*v2 = *v1;
*v1 = t;
}
list_node_t* reverse_list(list_node_t* l)
{
list_node_t* result = NULL;
while (l != NULL) {
rotate_right(&l->next, &l, &result);
}
return result;
}