141环形链表

141环形链表

写在前面

因为原稿在操作时不慎丢失,所以忍痛再写!肯定不会比之前详细了

下面是题目

下面是题目给出的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 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)
{
}
};

下面是题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
class Solution {
public:
bool hasCycle(ListNode *head)
{
ListNode *cur1 {head} ;//cur1 是快指针
ListNode *cur2 {head};//cur2 是慢指针
if(head||head->next)//如果头节点就是空,那就直接输出false
return false;
while(cur1 &&cur2 )
// 当当前的快指针和快指针指向的空间不为空,那么就可以进行一种“追赶操作“,此外,在同一链表中使用快慢指针,可以确定链表的中心所在节点
//这里需要注意,只能是先cur1!=NULL再写cur1->next!=NULL,这是有顺序的,反过来会报错!
{

cur1 = cur1->next;//每次执行,快指针指向后面第二个空间
cur2 = cur2->next;//慢指针指向后面第一个空间
//如果这是一个循环链表,那么cur1,cur2一直处于一个循环的状态
//而因为cur1跑得比cur2快,所以最终会追上cur2
//所以当他们重合时,就是我们要证明的——是循环链表。
if(cur1)
{
cur1 = cur1->next;
}else
{
return
}
if (cur1 ==cur2)
return true;
}
//如果到最后cur1指向的区域为NULL,那么很遗憾吗,跳出了循环,直接输出false
return false;
}
};
-------------本文结束,感谢您的阅读-------------