题解 | 判断链表中是否有环
判断链表中是否有环
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;
    }
};
数据结构之链表 文章被收录于专栏
 链表是数据结构中的重要内容,其编程问题围绕链表的特性(动态内存、指针关联、非连续存储等)展开,常见问题可归纳为以下几类,涵盖基础操作、算法技巧及边界场景处理: 一、基础操作类 二、查找与定位类 三、反转与逆序类 四、环相关问题 五、合并与拼接类 六、相交与公共节点类 七、去重与筛选类 八、排序类 九、特殊结构链表问题 十、边界与细节处理
 投递高德地图等公司10个岗位
投递高德地图等公司10个岗位