Нахождение «N-го узла от конца» связанного списка - PullRequest
22 голосов
/ 27 февраля 2010

Кажется, это верный ответ, но я не уверен, что это действительно лучший способ. Кажется, я посещаю первые n узлов слишком много раз. Какие-либо предложения? Обратите внимание, что я должен сделать это с помощью односвязного списка.

Node *findNodeFromLast( Node *head, int n )
{
    Node *currentNode;
    Node *behindCurrent;
    currentNode = head;
    for( int i = 0; i < n; i++ ) {
        if( currentNode->next ) {
            currentNode = currentNode->next;
        } else {
            return NULL;
        }
    }

    behindCurrent = head;
    while( currentNode->next ) {
        currentNode = currentNode->next;
        behindCurrent = behindCurrent->next;
    }

    return behindCurrent;
}

Ответы [ 11 ]

0 голосов
/ 27 февраля 2010

Вы можете использовать двусвязный список, который представляет собой связанный список, в котором также хранится адрес его родителя. Проходить гораздо проще, так как вы можете начать с конца и начать свой путь к началу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...