Связанный список палиндромов

#c #linked-list #palindrome

#c #связанный список #палиндром

Вопрос:

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

 /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        ListNode *fast= head;
        ListNode *slow= head;
        
        while( fast!=NULLamp;amp;fast->next !=NULL)
            {
            fast=head->next->next;
            slow=head->next;
        }
        slow= reverse(slow);
        fast= head;
      
        while(slow!=NULL)
            { 
               if(fast->data!=slow->data)
                   return false
                   slow =slow->next;
            fast=fast->next;
            }
        return true;
    }
    public: ListNode reverse(ListNode *head){
       ListNode *prev = NULL;
        while(head!=NULL)
            {
            ListNode* nextnode=head->next;
            head->next=prev;
            prev=head;
            head=nextnode;
            
        }
        return prev;
    
    }
};
 

Я получаю эту незначительную ошибку, пожалуйста, помогите исправить код

Строка 22: Символ 15: ошибка: присвоение ‘ListNode *’ из несовместимого типа ‘ListNode’
медленный = обратный (медленный);

Комментарии:

1. Вы должны (или получите) аналогичную ошибку с return prev; в конце reverse ; помогает ли это определить, в чем проблема?

2. «Не исправлено» — это почти совершенно бесполезный комментарий. Что вы изменили? Каков был результат?

Ответ №1:

Прежде всего, как вы можете видеть ниже, ваша обратная функция возвращает объект типа ListNode.

 ListNode reverse(ListNode* head)
{
    ListNode* prev = NULL;
    while (head != NULL) {
        ListNode* nextnode = head->next;
        head->next = prev;
        prev = head;
        head = nextnode;
    }
    return prev;
}
 

Однако вы хотите вернуть «prev», который имеет тип ListNode *, поэтому я предлагаю вам изменить возвращаемый тип с «ListNode» на «ListNode *» в вашей обратной функции следующим образом:

 ListNode* reverse(ListNode* head)