链表的回文结构

C / C++

文章目录

题目

一、思路

二、方法与代码

1.偶数个时

2.奇数个时

代码


题目

牛客 - 链表回文

链表的回文结构_第1张图片


 

一、思路

①找到中间节点mid

②以mid开始,将其后面的节点逆置,返回得到逆置后的新头,记为newhead

③对比原 head->val 是否等于 newhead->val,若等于则都->next,否则返回false

④当head / newhead 都为NULL时,遍历结束,说明每个val都相同,返回true

奇偶个节点数都一样的

二、方法与代码

1.偶数个时

链表的回文结构_第2张图片

2.奇数个时

链表的回文结构_第3张图片


 

代码

bool chkPalindrome(ListNode* head) {
        ListNode*newhead,*mid;// 创建中间节点mid和新头newhead
        mid=middleNode(head);//  使用 找中间节点 的函数
        newhead=reverseList(mid); //  使用 逆置 mid 的函数
        while(head && newhead)
        {
            if(head->val != newhead->val)
            {
                return false;
            }
            else
            {
                head=head->next;
                newhead=newhead->next;
            }
        }
        return true;     
    }

注意:

① 找到中间节点后,不把前面节点的next置为NULL(即切断),不好找前一个,会很麻烦

② reverseList 逆置函数  和 middleNode 找中间节点函数 在我前面几节的内容

Link : 找中间节点  +  翻转链表

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