经典链表题-链表回文结构

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌

🌸🌸🌸这里是我分享C/C++编程、数据结构应用的乐园✨

🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞

📝专栏指路:

📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。

📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。

链表的回文结构

温馨小提示:点击即可做题,想回顾链表知识可以点击单链表双链表

必知知识:回文数

回文数是指一个整数,无论从左到右读还是从右到左读,其数字序列都是相同的。

题目:

9b2ec20c11844f5489e8e12c51a7a07f.png

画图分析:

47922433f88549ada8e98ec4b63e51f3.png

题目思路分析:

1.先找出中间节点

链表的中间节点(点击即可做题)找中间节点力扣上直接有这个题目,我们以此来分析思路

1347c78dc94e40c485214cc9fbea015b.png

解决思路:快慢指针

快指针走两步,慢指针走一步

奇数个节点快指针的next指针为空时,慢指针刚好走到链表的中间节点

偶数个节点快指针为空时,慢指针刚好走到链表的中间节点

65e1c6b5af5b4dcc96c03e0c462f2295.png

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
    //创建快慢指针,快指针走两步,慢指针走一步
    ListNode*fast,*slow;
    fast=head;
    slow=head;
    while(fast&&fast->next)//不可以换位置,在链表节点偶数个结束循环是fast==NULL,
    //交换位置会对空指针解引用
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

2.反转链表

反转链表(点击即可做题)找中间节点力扣上直接有这个题目,我们以此来分析思路

c05058c489fc428da6b988732539cd01.png

解决思路:迭代

假设链表为 1→2→3→∅我们想要把它改成 ∅←1←2←3

我们需要定义三个指针

一个指针初始化为空

一个指针指向原链表的头结点

一个指针指向原链表头结点的next指针指向的节点

代码实现


struct ListNode*reverse(struct ListNode*head)
{
     if(head==nullptr||head->next==nullptr)//只有一个节点或链表为空
    {
        return head;
    }
    struct ListNode*n1,*n2,*n3;
    n1=nullptr;
    n2=head;
    n3=n2->next;//保存当前节点的next指针
    while(n2)
    {
        n2->next=n1;//当前节点的next指针指向前一个节点
        n1=n2;
        n2=n3;
        if(n3)//n3最先为空此时n2还没有为空没有出循环,不能对空指针n3解引用
        n3=n3->next;
    }
    return n1;
};

最后我们来实现一下

链表回文结构的代码

// typedef struct ListNode ListNode;
// struct ListNode {
//     int val;
//     struct ListNode* next;
//     ListNode(int x) : val(x), next(NULL) {}
// };

//寻找中间节点,快慢指针
struct ListNode*middleNode(struct ListNode*head)
{
    struct ListNode*fast,*slow;
    fast=head;
    slow=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
 
};
//翻转链表
struct ListNode*reverse(struct ListNode*head)
{
     if(head==nullptr||head->next==nullptr)//只有一个节点或链表为空
    {
        return head;
    }
    struct ListNode*n1,*n2,*n3;
    n1=nullptr;
    n2=head;
    n3=n2->next;
    while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)//n3最先为空此时n2还没有为空没有出循环,不能对空指针n3解引用
        n3=n3->next;
    }
    return n1;
};

class PalindromeList {
  public:
    bool chkPalindrome(ListNode* A) {
       struct ListNode*mid=middleNode(A);
       struct ListNode*rmid=reverse(mid);
       while(A&&rmid)
       {
        if(A->val!=rmid->val)
        {
            return false;
        }
        A=A->next;
        rmid=rmid->next;
       }
       return true;
    }
};

补充拓展

回文数是在数学中具有特殊的性质,也常被用于各种有趣的数学游戏和谜题中。

以下是关于回文数的几个关键点:

1.定义:设n是一个任意自然数,如果将其各位数字反向排列后得到的自然数n1与n相等,那么n就被称为回文数。例如,121、1331和12321都是回文数。
特征:
2.对称性:回文数的最大特点就是其对称性,无论从左到右还是从右到左读,数字序列都是相同的。
3.有限性:尽管正整数集是无限的,但回文数集却是有限的。对于任意给定的位数n,只有有限个n位回文数存在。例如,对于两位数,只有9个回文数(11、22、33、...、99)。
4.递增性:随着位数的增加,回文数的数量也呈现出递增的趋势。但这种递增并不是线性的,因为随着位数的增加,符合条件的回文数数量增长速度逐渐减慢。
5.生成方式:回文数可以通过多种方式生成。一种简单的方法是将一个数字反转后与原数字相加,重复这个过程直到得到一个回文数为止。例如,从数字4开始,我们得到4+4=8,8是回文数;从数字6开始,我们得到6+9=15,15不是回文数,但51+15=66,66是回文数。
6.数量统计:
1位数的回文数有9个(不包括0),它们的和是45。
2位数的回文数有9个,分别是11、22、33、...、99,它们的和是495。
3位数的回文数有90个,它们的和是49500。
7.应用:
在数学中,回文数是一种特殊的整数,研究回文数可以揭示整数的一些特殊性质和规律。例如,回文数和质数、完全平方数等数学概念相结合,可以产生一些有趣的数学问题和挑战。
在密码学和信息安全领域,回文数被用来构造强密码和加密算法,可以在一定程度上保证信息的加密和解密过程的安全性。
在诗歌、音乐等文化艺术中,回文数也具有一定的音韵美感和意象意义,可以用来构成一些优美的诗歌、歌词等。
 

持续更新中...

敬请期待

  • 36
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值