每日一题——力扣141. 环形链表(举一反三+思想解读+逐步优化)


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

我的写法

专业点评

时间复杂度分析

空间复杂度分析

总结

我要更强

方法2:使用哈希表

方法3:修改节点结构(不推荐)

方法4:反转链表(不推荐)

结论

哲学和编程思想

快慢指针 (Floyd's Cycle-Finding Algorithm)

哈希表法

修改节点结构法

反转链表法

举一反三

技巧1:双指针技术

技巧2:哈希表技术

技巧3:状态标记法

技巧4:反转操作

技巧5:递归与迭代

技巧6:分治法

技巧7:贪心算法

技巧8:动态规划

技巧9:回溯法

技巧10:模拟法


题目链接


我的写法

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */
 
bool hasCycle(struct ListNode *head) {
    // 定义两个指针,slow 和 quick,初始都指向链表的头节点
    struct ListNode *slow = head;
    struct ListNode *quick = head;
    
    // 如果链表为空或只有一个节点,则不可能存在环,返回 false
    if (!head || !head->next) {
        return false;
    }
    
    // 使用 for 循环来遍历链表,循环条件是 slow 和 quick 及其下一个节点都不为 NULL
    for (; slow && slow->next && quick && quick->next && quick->next->next;) {
        // slow 指针每次移动一步
        slow = slow->next;
        // quick 指针每次移动两步
        quick = quick->next->next;
        
        // 如果 slow 和 quick 指针相遇,则说明链表中存在环
        if (slow == quick) {
            return true;
        }
    }
    
    // 如果循环结束后没有相遇,说明链表中不存在环,返回 false
    return false;
}

 

这段代码实现了一个检测单链表是否存在环的功能,采用的是经典的快慢指针(Tortoise and Hare)算法。下面是对这段代码的专业点评及其时间复杂度和空间复杂度分析。

专业点评

  1. 代码结构清晰:
    • 代码结构合理,使用变量命名清晰,便于理解。
    • 初始检查部分有效地处理了特殊情况(空链表或只有一个节点的链表)。
  2. 循环条件:
    • 循环条件健全,确保在链表遍历过程中不会发生空指针引用错误。
    • for 循环中使用多个条件确保 slow 和 quick 及其下一个节点都有效。
  3. 快慢指针逻辑:
    • 快指针每次移动两步,慢指针每次移动一步,有效地检测链表中的环。
    • 如果存在环,快慢指针必定会相遇。
  4. 代码简洁性:
  • 代码简洁,逻辑明确,没有冗余的操作。

时间复杂度分析

  • 最坏情况:在没有环的情况下,快指针和慢指针遍历链表的每个节点。
    • 在这种情况下,快指针遍历节点数大约为 n/2,慢指针遍历节点数为 n,其中 n 是链表的节点数。
    • 因此,时间复杂度为 O(n)。
  • 最优情况:在存在环的情况下,快慢指针会在环内相遇。
  • 最多需要 O(n) 的时间,因为快指针和慢指针最终会在环内相遇。

综合来看,时间复杂度为 O(n)。

空间复杂度分析

  • 该算法只使用了两个额外的指针变量 slow 和 quick,不依赖于链表的大小。
  • 因此,空间复杂度为 O(1)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用哲学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值