题解 | 判断链表中是否有环

判断链表中是否有环

https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9?tpId=295&tqId=605&sourceUrl=%2Fexam%2Foj

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
//为了判断链表中是否有环,我们可以使用快慢指针算法(Floyd's cycle-finding algorithm)。该算法通过使用两个指针,一个每次移动一步(慢指针),另一个每次移动两步(快指针),来检测链表中是否存在环。如果链表中存在环,快指针最终会追上慢指针;如果不存在环,快指针会先到达链表末尾(即遇到null值)。

算法步骤:
如果链表头节点为空,直接返回false。

初始化两个指针slow和fast,都指向头节点。

循环遍历链表,直到fast或fast.next为空:

慢指针每次移动一步:slow = slow.next

快指针每次移动两步:fast = fast.next.next

在移动后,如果slow和fast相遇(指向同一节点),则返回true,表示有环。

如果循环结束(即fast或fast.next为空),返回false,表示无环。

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

数据结构之链表 文章被收录于专栏

链表是数据结构中的重要内容,其编程问题围绕链表的特性(动态内存、指针关联、非连续存储等)展开,常见问题可归纳为以下几类,涵盖基础操作、算法技巧及边界场景处理: 一、基础操作类 二、查找与定位类 三、反转与逆序类 四、环相关问题 五、合并与拼接类 六、相交与公共节点类 七、去重与筛选类 八、排序类 九、特殊结构链表问题 十、边界与细节处理

全部评论

相关推荐

挥毫自在:想白嫖你呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务