zhxue_11 2018-10-29 14:56 采纳率: 0%
浏览 615

leetcode234和141题,均使用快慢指针思路,为什么退出条件不一样?

假设链表为[1,2,3,4,5,6,7]
那么按照141题的退出条件
while (fast && fast->next)
最后fast指向7退出循环
使用234题的退出条件
while (fast->next && fast->next->next)
仍然是fast指向7退出循环
但是在实际操作中对141题使用234的条件或者对234使用141的条件均会报错,请问为什么?
第141题代码

 class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *slow = head, *fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast) return true;
        }
        return false;
    }
};

第234题代码

 class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if (!head || !head->next) return true;
        ListNode *slow = head, *fast = head;
        while (fast->next && fast->next->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        ListNode *last = slow->next, *pre = head;
        while (last->next) {
            ListNode *tmp = last->next;
            last->next = tmp->next;
            tmp->next = slow->next;
            slow->next = tmp;
        }
        while (slow->next) {
            slow = slow->next;
            if (pre->val != slow->val) return false;
            pre = pre->next;
        }
        return true;
    }
};
  • 写回答

1条回答 默认 最新

  • threenewbee 2018-10-30 04:32
    关注

    你没有给出代码,我找到了一个

    class Solution110_1 {//设置快慢指针,翻转后一半列表
    public:
        ListNode *reverselist(ListNode *head)
        {
            ListNode *pre = NULL;
            ListNode *next = NULL;
            while (head!=NULL)
            {
                next = head->next;
                head->next = pre;
                pre = head;
                head = next;
            }
            return pre;
        }
        bool isPalindrome(ListNode* head) {
            if (head == NULL || head->next == NULL)
                return true;
            ListNode *slow = head;
            ListNode *fast = head;
            while (fast->next!=NULL && fast->next->next!=NULL)
            {
                slow = slow->next;
                fast = fast->next->next;
            }
            slow->next = reverselist(slow->next);
            slow = slow->next;
            while (slow!=NULL)
            {
                if (slow->val != head->val)
                    return false;
                slow = slow->next;
                head = head->next;
            }
            return true;
        }
    };
    

    循环体里
    slow = slow->next;
    fast = fast->next->next;
    这里fast还是可以通过两个next找到最后的。
    关键看你的循环体怎么写。

    你调试下就知道了。

    评论

报告相同问题?

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏