您的位置:首页 > 其它

《leetCode》:Linked List Cycle

2015-11-25 20:26 363 查看

题目

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?


题目大意:不能用额外的空间来判断一个链表是否有环。

思路

如果一个链表存在环,当我遍历这个链表时,将我们遍历过的每个节点进行标记,如果被标记的节点又被遍历到的时候就出现了环,基于这样的一个思路就开始写代码,但是问题来了,应该用什么特殊的值来进行标记呢???没有发现,于是发现这个根本就行不通,但是自己还是试了下,用-1000000000作为标记,如下:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
if(head==NULL){
return false;
}
struct ListNode *cur=head;
struct ListNode *next=head;
while(cur->next!=NULL){
if(cur->val!=-1000000000){//设置一个标志位
cur->val=-1000000000;
}
else{
return true;
}
cur=cur->next;
}
return false;
}


由于是自己随便选的一个数作为节点遍历过的标记,原以为肯定不能AC,发现居然AC了也,只能说这个测试平台还需要完善。

AC结果如下:



虽然上面的代码AC了,但是自己知道此题的考点并不在此,因此,自己将会继续思考。

思路二

思路:用两个指针来进行遍历即可 ,一个只移动一个节点,一个移动两个节点 ;如果一前一后的节点最终指向了同一个节点,则说明有环,否则无环。

实现代码如下:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
if(head==NULL||head->next==NULL){//没有节点和只有一个节点不会出现环
return false;
}
struct ListNode *oneStep=head;
struct ListNode *twoStep=head->next;
while(oneStep!=twoStep){
if(twoStep==NULL||oneStep==NULL||twoStep->next==NULL) return false;
else{
oneStep=oneStep->next;
twoStep=twoStep->next->next;
}
}
//如果oneStep和twoStep指针指向了同一个节点,则必定有环
return true;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: