Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
题意:查看一个链表是否存在圈,不使用额外的空间
分析:不使用额外的空间意味着空间复杂度为O(1)
解题思路看代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/*
这个题我开始写超时了,原因我没有考虑部分圈的情况
整个圈:1 -> 2 -> 3 -> 1
部分圈:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 4
看讨论发现有个好办法就是使用两枚指针,一枚指针每次移动1步,另一枚每次移动2步
如果有圈,两枚指针终有一刻会相遇
如果没有圈,移动得快的那一枚就会遇到NULL
*/
bool hasCycle(ListNode *head) {
if(head == NULL || head -> next == NULL) return false;
ListNode *oneStep = head, *twoStep = head;
while(twoStep -> next != NULL && twoStep -> next -> next != NULL){
oneStep = oneStep -> next; // 每次移动一步
twoStep = twoStep -> next -> next; // 每次移动两步
if(oneStep == twoStep) // 相遇代表存在圈
return true;
}
return false; // 遇到了NULL
}
};
本文介绍了一种高效检测链表中是否存在循环的方法,通过使用两个指针,一个每次移动一步,另一个每次移动两步,以此来判断链表是否具有循环结构。
828

被折叠的 条评论
为什么被折叠?



