C++ 快慢指针求ListNode中点

本文探讨了使用快慢指针寻找链表中间节点的算法,并分析了一种常见实现方式的潜在bug及其修正方案。通过对比不同判断条件,深入理解快慢指针在链表操作中的应用及注意事项。

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

用快慢指针求ListNode的中点,网上的答案大都是下面这个:

struct ListNode {
      int val;
      ListNode *next;
      ListNode(int x) : val(x), next(NULL) {}
 };
class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* slow = head;
        ListNode* fast = head;
        while (fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
};

但是实际运行时会报bug,原因在于循环的判断条件,如果fast==NULL,那么利用NULL指针访问next(第二个条件)必然会报错,基于此,做如下修改:

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

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        if(head==NULL){
            return head;
        }
        if(head->next==NULL){
            return head;
        }
        ListNode *slow=head;
        ListNode *fast=head;
        while(fast!=NULL){
            if(fast->next==NULL){
                break;
            }
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }
};

在利用快慢指针判断链表中有没有环的题目中,也需要这样的判断,因为如果把两个判断条件写在一起,在第一个不满足的情况下,第二个会出现访问的问题。

最近又重新考虑了这个问题,发现原始代码应该是没错的,因为  && 连接的两个判断条件,当第一个条件不满足时不会再考虑第二个条件,因此也就不存在上述的问题。。。。。。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值