链表求上中点

这篇博客探讨了如何在链表中找到中点,以及利用快慢指针检测回文链表的方法。作者通过比喻解释了链表中点的概念,并详细分析了奇偶长度链表中点的确定方式。同时,介绍了LeetCode 234题的解题思路,强调了在无头结点链表中初始化slow和fast指针的重要性。博客还分享了判断回文链表的代码实现,以及在循环中的判断条件和终止条件的巧妙设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设是一个带头结点的链表,头结点就是无用的嘛,我是方便理解让他们从同一位置出发了嘛,就仿佛你们站在起跑线之外。假设小花同学和你(大叶同学)比赛玩跳跳棋,小花腿短一次只能跳一步,你(大叶同学)大长腿一次跳两步,赛程如果是奇数如下图。在这里插入图片描述
图横着看,别大聪明地上下看,1、2、3分别代表第一次移动、第2次移动、第3次移动。
最后星星那里就是中点。代码就设成slow=fast=head
赛程如果是偶数如下图。在这里插入图片描述
明显你到了终点,小花才到一半,看图,假设是奇数,那你就要走n/2+1(3/2+1=2整数除法咱计算机人都懂)次对吧,小花也是走n/2+1步,n/2就是左半拉,再加个1就是正中间;假设是偶数,你走完全程,小花走完左半拉,就是上中点;下中点也好说,那就是上中点的下一个就是p->next啦。
代码如下:
leetCode 234回文链表
这个题目是不带头结点的,也就是head指向的是第一个有用数据节点而非无用头结点,那么slow=head,fast=head->next,就相当于第一步走完了。

bool isPalindrome(ListNode* head) {
        if(head==nullptr||head->next==nullptr)return true;
        //上面那一句我是判断链表的长度是0则一定是回文链表,长度是1也一定是回文
        ListNode *slow=head,*fast=head->next;
        while(fast&&fast->next){
            slow=slow->next;
            fast=fast->next->next;
        }//slow所指的是我的终点,之后逆置

这个判断语句,蛮不好想的,fast->next用来判断走没走到终点,那走到最后一个节点肯定就是fast->next==nullptr对吧,如果fast->next≠nullptr,那fast->next->next一定存在,不会出现不存在的情况,最多就是null对吧。那它是null了之后不又再次赋给fast了吗,那我肯定要再判断fast是否为nullptr,因为nullptr肯定没有next域,所以判断条件就是while(fast&&fast->next),而且fast放前头,0&x=0就不会往后判断了,你要是把fast->next放前头可就大错特错了。
刚才也说了,下中点就用slow->next就好,蛮不喜欢背好多程序的,容易乱。
就这样,bye~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值