和光玉子 2023-10-28 16:36 采纳率: 66.7%
浏览 6
已结题

判断是否为环形链表问题

判断是否为环形链表算法
输出的案例答案是错的,应该是链表初始化的问题,但是不知道哪错了


#include <iostream>
using namespace std;

struct ListNode{
    int val;
    struct ListNode* next;
};

bool hasCycle(ListNode* head) {
    ListNode* fast = head;
    ListNode* slow = head;
    while (fast != nullptr) {
        fast = fast->next;
        if (fast != nullptr) {
            fast = fast->next;
        }
        if (slow == fast) {
            return true;
        }
        slow = slow->next;
    }
    return false;
}

int main() {
    ListNode node1 = { 3, NULL };
    ListNode node2 = { 2, NULL };
    ListNode node3 = { 0, NULL };
    ListNode node4 = { -4, NULL };
    node1.next = &node2;
    node2.next = &node3;
    node3.next = &node4;
    ListNode* head = &node1;
    bool ans = hasCycle(head);
    cout << boolalpha << ans << endl;
    return 0;
}
  • 写回答

2条回答 默认 最新

  • we will rise. 2023-10-28 19:34
    关注

    判定是不是有问题哇,万一只有一个节点,而且你没有把测试用例头尾连起来,创建的时候可以直接用结构体指针的

    
    int main()
    {
        struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* n5 = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* n6 = (struct ListNode*)malloc(sizeof(struct ListNode));
    
        n1->val = 1;
        n2->val = 1;
        n3->val = 1;
        n4->val = 1;
        n5->val = 1;
        n6->val = 1;
    
        n1->next = n2;
        n2->next = n3;
        n3->next = n4;
        n4->next = n5;
        n5->next = n6;
        n6->next = NULL;//如果想要变成带环可以修改其中节点的next指向前边的节点
        return 0;
    }
    

    判定是否带环可以这样

    bool hasCycle(ListNode* head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while (fast->next->next != NULL)
        {
            fast = fast->next->next;
            slow=slow->next;
            if (slow == fast)
            {
                return true;
            }
        }
        return false;
    }
    
    

    快指针一次两步,慢指针一次一步,如果有环就是追击问题,一定能追上的,如果没有,那么fast遇到NULL就结束循环,防止访问空

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月5日
  • 已采纳回答 10月28日
  • 创建了问题 10月28日

悬赏问题

  • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥30 电脑误删了手机的照片怎么恢复?
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办