前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言每日一题(34)链表的回文结构

C语言每日一题(34)链表的回文结构

作者头像
对编程一片赤诚的小吴
发布2024-01-23 15:10:05
650
发布2024-01-23 15:10:05
举报

牛客网 回文链表

题目描述

描述

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

代码语言:javascript
复制
1->2->2->1
代码语言:javascript
复制
返回:true

思路分析

找到链表的中间结点,将中间结点后的链表进行逆置,一个从头开始遍历到中间结点,一个从中间结点遍历到尾结点进行匹配,如果存在值不相等的就不是回文链表。

对于存在的结点个数为奇数或偶数的情况,当找到中间结点并进行逆置时,偶数情况下则是正常情况,奇数情况下,中间结点逆置后,它的前驱结点的next值依然指向逆置后的中间结点,不影响遍历。

代码语言:javascript
复制
class PalindromeList {
  public:
    struct ListNode* middleNode(struct ListNode* head) {//取中间结点
        struct ListNode* slow = head;
        struct ListNode* fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;

    }
    struct ListNode* ReverseList(struct ListNode* head ) {//逆置链表
        struct ListNode* pre = NULL;
        struct ListNode* cur = head;
        struct ListNode* nex = cur->next;
        while (cur != NULL) {
            cur->next = pre;
            pre = cur;
            cur = nex;
            nex = cur->next;
        }
        return pre;
    }
    bool chkPalindrome(ListNode* A) {//进行判断
        ListNode* middle=middleNode(A);
        ListNode* rev=ReverseList(middle);
        ListNode* cur=A;
        while(cur&&rev)
        {
            if(cur->val!=rev->val)
            {
                return false;
            }
            cur=cur->next;
            rev=rev->next;
        }
        return true;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
    • 描述
    • 思路分析
    相关产品与服务
    腾讯云服务器利旧
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档