Разное

Jan 03, 2012 11:52

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;
}
Previous post Next post
Up