C ++: проверка палиндрома в LinkedList - рекурсивный метод - ошибка - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь найти палиндромы в заданном связанном списке, рекурсивно переходя к последнему узлу в списке и сравнивая первый узел с последним узлом в списке.

Мой LinkedList имеет стандартные узлы с элементом значения int и указателем на следующий узел.

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

Фрагмент кода:

bool isPalindromeRecur(Node** left, Node* right){
            if(right == nullptr) return true;
            bool isP = isPalindromeRecur(left,right->next);
            if(!isP) return false;
            bool isP1 = (*(left)->val == right->val);
            *left = *(left)->next;
            return isP1;
        }

Я получаю ошибки в строках 5 и 6.

error: request for member 'val' in '* left', which is of pointer type 'Node*' (maybe you meant to use '->' ?)
             bool isP1 = (*(left)->val == right->val);
                                   ^~~
error: request for member 'next' in '* left', which is of pointer type 'Node*' (maybe you meant to use '->' ?)
             *left = *(left)->next;
                              ^~~~

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

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

Также первый аргумент Node** left type является излишним. Этот вид аргументов полезен, когда вам нужно изменить список (вставить или удалить элементы).

bool isPalindromeRecur(Node* left, Node* right) {
    assert(left);
    assert(right);
    if (left == right) return true; // for odd length
    if (left->value != right->value) return false;
    if (left->next == right) return true; // for even length
    return isPalindromeRecur(left->next, right->prev);
}

если ваш список не имеет двойной связи, это сделать намного сложнее.

0 голосов
/ 13 июля 2020

Вы должны использовать (*left)->... вместо *(left)->... в обеих строках. Оператор -> имеет более высокий приоритет, чем оператор *, поэтому *(left)->next будет анализироваться как *(left->next). Поскольку left имеет тип Node **, это будет похоже на попытку доступа к next члену указателя.

...