【力扣刷题实战】环形链表
大家好,我是小卡皮巴拉
文章目录
目录
力扣题目: 环形链表
题目描述
示例 1:
示例 2:
示例 3:
解题思路
问题理解
算法选择
具体思路
题目要点
完整代码(C语言)
兄弟们共勉 !!!
每篇前言
博客主页:小卡皮巴拉
咱的口号:🌹小比特,大梦想🌹
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。
力扣题目: 环形链表
原题链接: 环形链表
题目描述
给你一个链表的头节点
head
,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪
next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回
true
。 否则,返回false
。示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
解题思路
问题理解
给定一个链表的头节点
head
,我们需要判断链表中是否存在环。链表中的环意味着存在某个节点,通过连续跟踪其next
指针会再次回到这个节点。算法选择
我们选择使用快慢指针(也称为龟兔赛跑算法)来解决这个问题。快指针每次移动两步,慢指针每次移动一步。如果链表中存在环,那么快慢指针最终会在环内相遇。如果链表中没有环,那么快指针会先到达链表的尾部(即
null
)。具体思路
初始化快慢指针:
定义两个指针
slow
和fast
,并将它们都初始化为指向链表的头节点head
。快慢指针移动:
使用一个
while
循环来移动快慢指针,循环条件是fast
和fast->next
都不为null
(因为快指针需要移动两步,所以需要确保fast->next
存在)。在每次循环中,慢指针
slow
移动一步(slow = slow->next
)。同时,快指针
fast
移动两步(fast = fast->next->next
)。检查相遇:
在每次循环中,检查
slow
和fast
是否相等。如果相等,说明快慢指针在环内相遇,链表中存在环,返回true
。循环结束:
如果快指针
fast
或fast->next
到达了链表的尾部(即null
),说明链表中没有环,退出循环并返回false
。
题目要点
快慢指针:使用快慢指针(
slow
和fast
)来判断链表中是否存在环。边界条件:虽然题目没有明确要求处理空链表或只有一个节点的链表,但根据算法逻辑,这些情况下快指针会很快到达
null
,从而正确返回false
。因此,不需要额外处理这些边界条件。
完整代码(C语言)
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow = head,*fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast){return true;}}return false; }
兄弟们共勉 !!!
码字不易,求个三连
抱拳了兄弟们!