leetcode234——回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

解题思路:针对该题,首先我们可以找到链表的中间节点,然后将链表的后半部分反转,以便进行比较。但是针对链表节点个数的奇偶又有一些不同。

leetcode234——回文链表_第1张图片我们经由图上可知,当链表节点是偶数个时,遍历到合适的位置时,fast=NULL,此时可以将slow以后的链表反转,根据slow是否指向空,为判断标准进行比较;如果是奇数个节点,我们就将,slow再往后指向一个节点,再反转。

 struct ListNode* reverse(struct ListNode* head){
    struct ListNode* pre=NULL;
    struct ListNode* cur=head;
    while(cur!=NULL)
    {
        struct ListNode* nxt=cur->next;
        cur->next=pre;
        pre=cur;
        cur=nxt;
    }
    return pre;
}
bool isPalindrome(struct ListNode* head){
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(fast!=NULL&&fast->next!=NULL)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    if(fast!=NULL)
    {
        slow=slow->next;
    }
    slow=reverse(slow);
    fast=head;
    while(slow!=NULL)
    {
        if(slow->val!=fast->val) return false;
        else{
            fast=fast->next;
            slow=slow->next;
        }
    }
    return true;
}

你可能感兴趣的:(链表,数据结构,c语言,leetcode)