剑指 Offer II 027. 回文链表

日常刷题中🐵

GitHub链接😉

diwei00 (github.com)icon-default.png?t=M5H6https://github.com/diwei00刷题代码都在Exercise库中提交

LeetCode链接😁

剑指 Offer II 027. 回文链表 - 力扣(LeetCode)icon-default.png?t=M5H6https://leetcode.cn/problems/aMhZSa/

题目😯

给定一个链表的 头节点 head ,请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例1

输入: head = [1,2,3,3,2,1]
输出: true

示例2

输入: head = [1,2]
输出: false

题目解析🤨

     首先,回文链表的判断要用第一个节点数据和最后一个节点数据进行比对,然后在用第二个节点和倒数第二个节点数据比对,以此类推。因为这是单链表,他不像顺序表那样可以随机访问数据,只能从前往后遍历链表。

     分析题目发现,数据的比对是链表的前半部分和后半部分进行比较,所以我们需找到链表的中间节点。由于进行比对是前半部分节点数据和后半部分节点数据,所以考虑反转后半部分链表。

     这里找链表的中间节点,用的是快慢指针法,快指针一次走两步,慢指针一次走一步。区分奇偶个数节点链表,当快指针遍历完链表时,慢指针刚好在链表的中间节点。

     这里反转链表,用的是三指针法,为的是反转完可以找到下一个节点。

这里的两个思路在这篇博客中有详细介绍。

反转链表(AND)链表的中间结点_小小太空人w的博客-CSDN博客icon-default.png?t=M5H6https://blog.csdn.net/weixin_62353436/article/details/124332827?spm=1001.2014.3001.5501

代码实现(有详细注释)

bool isPalindrome(struct ListNode* head)
{
    struct ListNode* phead = head;
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    //快慢指针找中间节点
    while (fast != NULL && fast->next != NULL)
    {
      
        fast = fast->next->next;
        slow = slow->next;
    }
    struct ListNode* p1 = NULL;
    struct ListNode* p2 = slow;
    struct ListNode* p3 = slow->next;
    //反转后半部分链表
    while (p2 != NULL)
    {
        p2->next = p1;
        p1 = p2;
        p2 = p3;
        if (p3 != NULL)
        {
            p3 = p3->next;
        }
    }
    //比对数据
    while (p1 != NULL)
    {
        if (p1->val == phead->val)
        {
            p1 = p1->next;
            phead = phead->next;
            
        }
        else
        {
            return false;
        }
    }
    //全部数据都相等
    return true;
}

小结😆

    对于链表的操作,要考虑访问数据是不同于顺序表的,所以思路会有一定的差异。我们需大量的去刷题,锻炼编程思维, 相信坚持下去会有不一样的收获🤨。 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小太空人w

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

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

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

打赏作者

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

抵扣说明:

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

余额充值