Nowcoder. 链表的回文结构

文章详细介绍了如何使用C++编程实现判断一个链表是否为回文结构,包括找到链表中间节点、逆置链表后半段以及对比前半段和后半段来确定回文性的方法。关键步骤包括计算链表长度以找到中间节点,以及反转链表的后半部分。
摘要由CSDN通过智能技术生成

文章目录

回文数

代码实现

回文数是指一个像16961这样"对称"的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。 了解回文数 自然就能更好地理解回文链表

核心思路:

先找到中间节点
然后从中间节点开始 ,对后半段逆置
最后前半段和后半段进行比较 (从链表的头节点和逆转后返回的节点分别开始遍历判断)
如果相等就是回文结构 如果不相等 就不是回文结构

如果是奇数 ,节点就是中间
如果有两个中间结点,则返回第二个中间结点(偶数的情况)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需要注意一个细节 : 此时节点 2的next依然保存的是原链表节点 3的地址

class PalindromeList {
public:
struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* cur = head;
    int size = 1;
    //得到链表元素个数
    while (cur->next != NULL)
    {
        size++;
        cur = cur->next;
    }
    //第二次遍历 得到中间节点
    cur = head;
    int k = 0;
    size /= 2;  //5/2 =2 
    while (k < size)
    {
        k++;
        cur = cur->next;
    }
    return cur;

}
// 反转链表函数
struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* cur = head;
    struct ListNode* newhead = NULL;

    if (head == NULL)  //空链表
    {
        return NULL;
    }
    // 不是空链表 
    while (cur)
    {
        struct ListNode* next = cur->next; //保存下一个节点的地址
        //头插
        cur->next = newhead;
        newhead = cur;
        cur = next;

    }
    return  newhead;

}
bool chkPalindrome(struct ListNode* head) //判断回文链表
{
    // 找中间节点
    struct ListNode* mid = middleNode(head);
    // 从中间节点开始反转链表
    struct ListNode* rhead = reverseList(mid);

    // 判断
    while (head && rhead)
    {
        if (head->val != rhead->val)
        {
            return false;
        }

        rhead = rhead->next;
        head = head->next;
    }

    return true;
}
};

如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鄃鳕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值