这道题给出一个链表,若链表中任意一个节点的指针指向链表中其他节点,则判断这个列表为环形列表。这道题我们使用快慢指针法,代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//本题使用快慢指针法,当快指针移动两格时,慢指针移动一格
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *fast = head, *slow = head; //定义快慢指针
while(fast && fast->next){ //当快指针与快指针的下一指针均不为空时,程序继续运行
fast = fast->next->next; //快指针跑两步
slow = slow->next; //慢指针跑一步
if(fast == slow) return true; //如果快指针与慢指针相等,则返回1
}
return false;
}
};
在写这道题是,曾经尝试 用while(slow&& slow->next) 来代替 while(fast && fast->next),但程序出错。经过思考,只要快指针没有遇上空,则慢指针永远都不会遇上空。如果链表为环形链表,则指针将永远跑下去,必定有一个点,快指针与慢指针相等,则可以判断该链表为环形链表。如果快指针遇到空指针,则循环退出,说明该链表不是环形链表。