判断链表是不是循环链表,怎么改


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {

    struct ListNode* node=head->next;

    struct ListNode* last=head;

    while(last->next){

        last=last->next;

    }

    int temp=0;

    while(node){

        if(last->next==node){

            temp=1;

            return true;
        }

        else{
            node=node->next;
        }
    }

    if(temp==0){
        return false;
    }
    
    
}

供参考:

bool hasCycle(struct ListNode* head) {

    struct ListNode* node = head, * last = head;
    if (head->next == NULL)
        return false;
    do {
        node = node->next;
        last = last->next->next;
    } while (last && last->next && node != last);
    return  node == last;
}

【以下回答由 GPT 生成】

为了优化这段判断链表是否为循环链表的代码,我们可以使用快慢指针的方法。快指针每次移动两步,慢指针每次移动一步,如果链表有环,那么快指针一定会追上慢指针。

以下是优化后的代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    if (head == NULL || head->next == NULL) {
        return false;
    }

    struct ListNode *slow = head;
    struct ListNode *fast = head->next;

    while (slow != fast) {
        if (fast == NULL || fast->next == NULL) {
            return false;
        }
        slow = slow->next;
        fast = fast->next->next;
    }

    return true;
}

在优化后的代码中,我们首先判断链表是否为空或只有一个节点,如果是,则肯定不是循环链表,直接返回false。

我们初始化两个指针,慢指针slow和快指针fast,分别指向链表头部和头部的下一个节点。

然后,我们进入一个循环,条件是慢指针和快指针不相等。循环中,慢指针每次向后移动一步,快指针每次向后移动两步。如果链表有环,快指针一定会追上慢指针,此时我们就可以返回true。

如果循环结束后仍然没有追上,那说明链表没有环,我们返回false。

这样,我们就通过使用快慢指针的方法,对判断链表是否为循环链表的功能进行了优化。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^